Управление компьютером через телефон

Тема в разделе "WASM.NETWORKS", создана пользователем BadGuy777, 2 окт 2010.

  1. BadGuy777

    BadGuy777 New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2010
    Сообщения:
    5
    Как-то в ксакепе наткнулся на статью "управление компьютером через телефон". На компе запускается простенькая серверная часть, которая при доступе к компьютеру выдает html-страницу, через которую можно выполнять некоторые действия(открыть\закрыть cd-rom и т д). Если комп не подключен к интернету - все нормально: набиваю в браузере http://127.0.0.1 - и страница появляется.
    При подключении к интернету возникают проблемы....
    Я использую билайновский юсб-модем и выход в интернет не прямой. Т е я вхожу в какую-то билайновскую сеть компьютеров, которая выходит в интернет через один компьютер-шлюз. Таким образом у меня есть 2 ip-адреса: адрес моего компьютера в локальной сети билайна и адрес этого компьютера-шлюза, через который вся сеть юзает интернет.
    Как же быть? Могу ли я как-то прорваться через эти иерархические сетевые дебри?

    Вот код серверной части(клиентская часть - любой браузер)

    Код (Text):
    1. /*
    2. *If you'll find any errors, please contact me (mailto:dinamius@mail.ru)
    3. *Copyright (C) 2000-2002 Steve Kandrushin
    4. */
    5. #include <windows.h>
    6. #include <winsock.h>
    7. #include <mmsystem.h>
    8. //To make program more small
    9. #pragma comment(linker,"/MERGE:.rdata=.text")  //Соединяем сегменты данных и кода
    10. #pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
    11. #pragma comment(linker,"/ENTRY:MyWinMain")
    12. #pragma comment(linker,"/NODEFAULTLIB")
    13.  
    14. //WML
    15. char s[20][62]=
    16.     {
    17.         "HTTP/1.1 200 OK\r\nContent-Type: text/vnd.wap.wml\r\n\r\n",
    18.         "<?xml version = \"1.0\"?>\r\n<!DOCTYPE wml PUBLIC \"-//WAPFORUM",
    19.         "//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">",
    20.         "\r\n<wml>\r\n<card id=\"Card1\" title=\"My Computer\">\r\n<p>",
    21.         "<a href=\"opencd\">OpenCD</a><br/>\r\n",
    22.         "<a href=\"closecd\">CloseCD</a><br/>\r\n",
    23. //      "<a href=\"swapms\">SwapMS</a><br/>\r\n",
    24.         "<a href=\"shut\">Shut Down</a><br/>\r\n",
    25.         "<a href=\"reset\">Reset</a><br/>\r\n",
    26.         "<a href=\"logoff\">LogOFF</a><br/>\r\n",
    27.         "</p>\r\n</card>\r\n</wml>\r\n"
    28.     };
    29.  
    30. /*//HTML
    31. char s[8][50]=
    32.     {
    33.         "HTTP/1.1 200 OK\r\nContent-Type: text/html;",
    34.         "charset=windows-1251\r\n\r\n",
    35.         "<html><title><<<FULL CONTROL>>></title><body>",
    36.         "<a href=\"opencd\">OpenCD</a><br>",
    37.         "<a href=\"closecd\">CloseCD</a><br>",
    38.         "<a href=\"reset\">Reset</a><br>",
    39.         "<a href=\"off\">OFF</a><br>",
    40.         "</body></html>"
    41.     };
    42. */
    43.  
    44. u_long crc32_table[256];
    45.  
    46. //Standart polynomial
    47. #define CRC32_POLY 0xEDB88320;
    48. //Initializating crc32 table
    49. void init_crc32()
    50. {
    51.     int i, j;
    52.     u_long c;
    53.     for (i = 0; i < 256; ++i)
    54.     {
    55.         for (c = i << 24, j = 8; j > 0; --j)
    56.             //c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : c << 1;
    57.             if(c & 0x80000000){c=(c << 1) ^ CRC32_POLY;} else {c=(c << 1);};
    58.         crc32_table[i] = c;
    59.     }
    60. }
    61.  
    62. //Count crc32
    63. u_long crc32(u_char *buf)
    64. {
    65.     u_char *p= buf;
    66.     u_long crc;
    67.     crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
    68.     while(*p!=0)
    69.     {
    70.         crc = (crc << 8) ^ crc32_table[(crc >> 24) ^ *(p++)];
    71.         if(*p==32) break;
    72.     };
    73.     return ~crc; /* transmit complement, per CRC-32 spec */
    74. }
    75.  
    76.  
    77. //Return position of n space
    78. int space(char * word, int n)
    79. {
    80.     if(n==0) return -1;
    81.     int nbsp=0;
    82.     for(int i=0; i<strlen((char *)word); i++)
    83.         if(word[i]==32)
    84.             if(++nbsp==n) return i;
    85.     return -666;//No such space
    86. }
    87.  
    88. //Return n word word[0], word[1],...
    89. char temp[1000];
    90. char * get(char * word, int n)
    91. {
    92.     int j=0;
    93.     if(space(word, n)!=-666)
    94.     for(int i=space(word, n)+1; i<strlen(word); i++)
    95.     {
    96.         if(word[i]==32) break; else temp[j++]=word[i];
    97.     }
    98.     temp[j]=0;
    99.     return temp;
    100. };
    101.  
    102. //Convert all english symbols to hi register
    103. u_char * UpString(u_char * str)
    104. {
    105.     int i=-1;
    106.     while(str[++i]!=0)
    107.         if((str[i]>96)&&(str[i]<123)) str[i]=str[i]&0xDF;
    108.     return str;
    109. };
    110.  
    111.  
    112.  
    113. void MyWinMain(void)
    114. {
    115.     DWORD size, nr;
    116.     boolean ButSwap=false;  //For mouse buttons swap
    117.     char Buff[1000];
    118.  
    119.     init_crc32();
    120.  
    121.     HANDLE out = CreateFile("C:\\dataxxx.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
    122.    
    123.     WSADATA WSAData;
    124.     WSAStartup(MAKEWORD(1,1), &WSAData);
    125.     SOCKET Sock0 = socket(AF_INET, SOCK_STREAM, 0);
    126.     sockaddr_in name;
    127.     name.sin_family      = AF_INET;
    128.     name.sin_port        = htons(80);
    129.     name.sin_addr.s_addr = htonl(INADDR_ANY);
    130.     if(bind(Sock0, (struct sockaddr FAR *) &name, sizeof(name))==SOCKET_ERROR)ExitProcess(0);
    131.  
    132.     listen(Sock0, 5);
    133.  
    134.  
    135. again:
    136.     SOCKET Sock1=accept(Sock0, NULL, NULL);
    137.    
    138.     while(true)
    139.     {
    140.         ioctlsocket(Sock1, FIONREAD, &size);
    141.         if(size>0)
    142.         {
    143.            
    144.             recv(Sock1,(char *)Buff,1000,0); //receive text
    145.             WriteFile(out, &Buff, size, &nr, NULL); // Write2File
    146.  
    147.             // Send data to cellphone
    148.             for(int i=0; i<12; i++)
    149.             {
    150.                 send(Sock1, s[i], strlen(s[i]), 0);
    151.                 WriteFile(out, &s[i], strlen(s[i]), &nr, NULL);
    152.             }
    153.             closesocket(Sock1);
    154.            
    155.             if( crc32(UpString( (u_char *)get(Buff, 0)))==0xA10411F ) //If == GET
    156.             switch( crc32(UpString( (u_char *)get(Buff, 1))) )
    157.             {
    158.                 //OPENCD
    159.                 case 0x52AD375F:
    160.                     mciSendString("SET CDAUDIO DOOR OPEN WAIT",0,0, 0); break;
    161.                 //CLOSECD
    162.                 case 0x3918CCDF:
    163.                     mciSendString("SET CDAUDIO DOOR CLOSED WAIT",0,0, 0); break;
    164.                 //SWAPMS
    165.                 case 0x334993FF:
    166.                     ButSwap=!ButSwap;SwapMouseButton(ButSwap); break;
    167.                 //SHUT
    168.                 case 0xE4F1DC3F:
    169.                     ExitWindowsEx(EWX_POWEROFF, 0); break;
    170.                 //RESET
    171.                 case 0x54DF1B7F:
    172.                     ExitWindowsEx(EWX_REBOOT, 0); break;
    173.                 //LOGOFF
    174.                 case 0x838B5D5F:
    175.                     ExitWindowsEx(EWX_LOGOFF, 0); break;
    176.             }
    177.            
    178.             goto again;
    179.         }
    180.     };
    181.     CloseHandle(out);          
    182. }
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Это называется NAT.
     
  3. BadGuy777

    BadGuy777 New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2010
    Сообщения:
    5
    Это понятно. Вопрос в другом: как подключиться к компьютеру, у которого нет прямого выхода в интернет?
    Например, мне известно, что некоторые онлайн-игры маил.ру и контакта(шахматы) используют прямое соединение между двумя компьютерами. А значит, один из компьютеров является сервером, а другой - клиентом. И никакие наты не мешают...
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    если оба компьютера за NAT'ом - то чаще всего никак.
     
  5. BadGuy777

    BadGuy777 New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2010
    Сообщения:
    5
    А как же тогда у меня скайп нормально работает? Хотя мой компьютер за натом.
    У моего друга тоже usb-мопед, и мы оба можем общаться по скайпу, хотя оба за натом...
    А скайп, насколько мне известно, использует p2p соединение
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    используется технология супернодов.
     
  7. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    ну дык используется сервер посредник в таком случае, у которого ip выделенный , и организовуй общение через него или доплати и воспользуйся услугой у прова статического ip
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    BadGuy777
    совершенно не обязательно. вполне может использоваться одноуровневые подключения.
    чтоб получить ип используются фиксированные посредники.
     
  9. BadGuy777

    BadGuy777 New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2010
    Сообщения:
    5
    А проще всего, наверное, воспользоваться существующими серверами ICQ или IRC. И управлять удаленным компьютером через сообщения в чате
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Наоборот. Чаще всего элементарно.
    Для этого надо просто сделать пробить NAT.

    У нас 2 протокола udp и tcp. Которые функционируют по разному.
    Так вот чтобы UDP функционировал. Нужна обратная связь, не обязательно но желательно. Поэтому NAT сервер в обязательном порядке запоминает адрес и порт отправителя и назначения. И помнит в течение определенного времени.
    Чтобы связь начала работать. Оба клиента должны отправить пакеты друг дружке. Тогда NAT зарегистрирует у себя порты и они смогут работать.

    Для удобства пользования применяют внешний сервер. Так как порты меняются, должны меняться. То каждый раз надо как-кто узнавать порт и IP. Вот клиенты конктятся на известный сервер с известным портом который не меняется, там обмениваются информацией.

    Почему порты меняются? Ресурс этот ограниченный и его может занять какой-то другой компьютер из вашей под сети. Хотя обычно на несколько часов он ваш.

    У TCP сложнее там есть сообщения подтверждения которые мешают такой схеме. Там надо конектится на уже доступный порт. Но благо в том что за частую NAT не проверяет обратные вхождения по IP!!! Им главное совпадение на портов. Тут как раз без стороннего сервера не обойтись.
    Клиент1 IP1 port1
    Клиент2 IP2 port2
    сервер IPs
    nat1 внешний ип IPn1
    nat2 внешний ип IPn2

    IP1:port1 шлет сообщение на сервер IPs:port3
    IP2:port2 шлет сообщение на сервер IPs:port3
    где они объмениваются информацией потом
    ip1:port1 шлет сообщение на ips:port2
    Ip2:port2 шлет сообщение на nat1:port1
    Нат пропустит сообщение, в большинстве случаев.


    Это как-раз и сделано для удобства пользователей.
    К примеру VoIP используют stun сервера.
    Протокол stun описан в RFC и используется для изучения различных типов NAT.

    Даже если NAT фильтрует сообщения по TCP, а UDP закрыт то велика возможность, что есть pnp.
    pnp это протокол в котором разрешено договориться с устройством nat сервером о том чтобы тот открыл порты.

    Суммирая всю информацию. Есть куча возможностей которые позволяют преодолеть NAT.

    Даже если NAT целиком закрыт, то можно сделать следующее поднять IPv6 он будет работать даже на односторонней связи. Когда клиент будет переодически опрашивать релей сервер для получения и отправки пакета. А вот IPv6 уже не отфильтруют натом.
     
  11. BadGuy777

    BadGuy777 New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2010
    Сообщения:
    5
    Больше всего мне нравится идея с ipv6. Но нет возможности использовать дополнительный выделенный сервер.
    Возможно ли организовать взаимодействие двух компьютеров(под натом) через ipv6 при условии, что эти самые компьютеры используют ipv6 через туннель(sixxs.net, например)?