Работа с сокетами windows

Работа с сокетами windows

Добрый день, уважаемые посетители и читатели блога, недавно я на одном из форумов наткнулся на дискуссию, на тему того, что такое сокеты windows и как их посмотреть и подумал, что это неплохая тема для статьи. Подумал и написал :)). Думаю эта заметка будет полезна начинающим системным администраторам, в понимании того, как на транспортном уровне модели OSI найти проблему или проверить доступность приложения по номеру порта, хочу отметить, что эти знания фундаментальные, и их понимание заложит в вас отличную базу, для дальнейшей работы, на любом предприятии.

Понятие windows sockets приложения

Что такое сокет — это по сути область оперативной памяти, в которой на определенном сетевом порту (TCP/UDP) работает приложение, и именно оно прослушивает нужный порт. Какая задача стояла перед программистами, задача простая переместить информацию из оперативной памяти одного компьютера, в оперативную память другого компьютера. Дальше это может быть представлено как:

Номер сокета Windows, это номер ячейки оперативной памяти к которому привязано приложение. Приложение привязавшись к некой области оперативной памяти начинает туда писать данные и сокет из этой области памяти начинает мелкими пакетами по 65 кбайт, начинает передавать в сеть на другое устройство. На другой стороне эти кусочки, так же помещаются в ОЗУ, желательно в той же последовательности, и сокет с той стороны начинает их разбирать, и представлять пользователю из какого то приложения.

Список сокетов приложений в Windows

У меня стоит операционная систем Windows 8.1, показывать я буду все на ней, в прошлый раз мы кстати в ней лечили баг, что был не найден run vbs. Для того, чтобы посмотреть какие сокеты соответствуют каким приложениям и каким TCP/UDP портам, вы должны перейти в директорию

и отыскать там файл services, он будет без расширения, но его можно открыть правой кнопкой мыши через обычный блокнот, у меня это будет notepad++.

Открыв данный файл вы увидите название службы (приложения) номер сокета (TCP/UDP) и описание. Для примера видно, что сервер ftp работает по портам 20 и 21. По сути тут системе и задаются стандарты по которым должны работать службы.

Как посмотреть сокеты приложений у вас на компьютере

Тут два метода которыми я пользуюсь. Представим себе ситуацию, что вы установили некое приложение, все работает пытаетесь на него попасть с другого компьютера по сети, но не можете. Отключаете брандмауэр на том компьютере, и все начинает работать, вывод блокируется какой то порт этого приложения. Его вычислить поможет нам две утилиты, первая из командной строки, а вторая имеет удобный графический интерфейс.

Более подробно про утилиту netstat и ее использование читайте по ссылке. В итоге вы получите сводную таблицу, в которой будет вот, что интересно:

  • Тип протокола — TCP или UDP
  • Адрес отправителя с указанием портов
  • Адрес получателя с указанием портов
  • Состояние — либо слушает либо установил соединение и закрыто
  • PID это номер идентифицирующий приложение
Читайте также:  Код события 400 windows 10

Как видите в примере у меня много сессий по 443 и 80 порту по сути это браузер Google Chrome.

Приложение заняв сокет, уже не позволит на нем же открыться другому приложению, Сокет живет минут 10.

Как изменить время жизни сокета

Для того, чтобы в операционной системе Windows изменить TTL или как его еще называют время жизни сокета, вам необходимо воспользоваться реестром. Открываете редактор реестра Windows 8.1. Переходите в раздел

Там есть ключ TcpTimedWaitDelay, если его нет то нужно его создать. Укажите нужное вам десятичное значение. TcpTimedWaitDelay — Этот параметр определяет интервал времени, в течение которого подключение находится в состоянии TIME_WAIT, прежде чем будет закрыто. Пока подключение находится в состоянии TIME_WAIT, пара сокетов не может быть использована повторно (это т. н. «состояние 2MSL»). Согласно документу RFC793, данное значение должно в два раза превышать максимальное время жизни пакета в сети.

Как узнать PID приложения

Для того, чтобы узнать PID приложения в Windows, вам нужно в области пуск кликнуть правой кнопкой мыши и из контекстного меню выбрать Диспетчер задач

В диспетчере задач, найдите поле ИД процесса .если его не будет то добавьте.

Теперь давайте смотреть, в правой части я вижу приложение skype и оно имеет PID 4352, смотрим в левой части экрана и видим порты и Ip адрес, которые слушает данной приложение.

Ну и еще есть утилита TCPView, про нее я уже отдельно писал. Утилита бесплатная и имеет графический интерфейс, запустив ее вы сразу видите кому какой PID принадлежит. Так же видно все сокеты и их состояния.

Думаю, у вас теперь не должно быть вопроса, что такое сокеты windows и как их посмотреть, всем спасибо за прочтение.

Пример работы с сокетами для Windows

Пример работы с сокетами для Windows

Писал, когда сам разбирался с этим делом. На базе этого
простого примера написано (точнее не совсем на его
базе, а скорее при его участии) пара серьезных
программок.

Все просто, как в танке. По исходникам разберетесь.

makefile

  1. all: socket.cpp config.h socket.h
  2. $(CC) socket.cpp

Download this code:makefile.txt

socket.cpp

  1. #include «stdio.h»;
  2. #include «socket.h»;
  3. #include «config.h»;
  4. static char Rec[2048000];
  5. bool SendString(SOCKET s,char* str) <
  6. int cnt=send(s,str,strlen(str),0);
  7. if (cnt==SOCKET_ERROR) return(false); else return(true);
  8. >
  9. char* GetString(SOCKET s) <
  10. char *str;
  11. char InBuff[2048];
  12. int cnt;
  13. strcpy(«»,Rec);
  14. while (cnt!=0) <
  15. memset(&InBuff,0,2048);
  16. cnt=recv (s, (char*)&InBuff, sizeof(InBuff),0);
  17. strcat(Rec,InBuff);
  18. >
  19. return((char*)&Rec);
  20. >
  21. int OpenURL(char *url) <
  22. char *none=»»;
  23. char query[2048];
  24. struct sockaddr_in ssin;
  25. struct hostent* hp;
  26. unsigned char strHlp[2048], *pch;
  27. int PortNum;
  28. char *http_host;
  29. char *http_path;
  30. if (memcmp(url,»HTTP://»,7)!=0 && memcmp(url,»http://»,7)!=0) return(7);
  31. url+=7;
  32. if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(1);
  33. // ЁбЇ®«м§гЉ¬ Default’®ўл© ­®¬Ља Ї®ав — 80, Љб«Ё ­Љ § ¤ ­ ¤агЈ®©
  34. strcpy(strHlp,url);
  35. pch = strchr((char*)strHlp,’:’);
  36. if (pch==NULL) <
  37. PortNum = 80;
  38. pch = strchr((char*)strHlp,’/’);
  39. if (pch!=NULL) <
  40. pch[0] = ‘\0’;
  41. http_path=pch+1;
  42. >
  43. else <
  44. http_path=none;
  45. >
  46. >
  47. else <
  48. pch[0] = ‘\0’;
  49. pch++;
  50. char *pch1 = strchr((char*)pch,’/’);
  51. if (pch1!=NULL) <
  52. pch1[0] = ‘\0’;
  53. http_path=pch1+1;
  54. >
  55. else <
  56. http_path=none;
  57. >
  58. PortNum = atoi(pch);
  59. if(PortNum==0) PortNum = 80;
  60. >
  61. // Џ®гз Љ¬ IP Ї® Ё¬Љ­Ё
  62. if ((hp=gethostbyname(strHlp))==NULL) return(1);
  63. http_host=strHlp;
  64. memset ((char *)&ssin, 0, sizeof(ssin));
  65. ssin.sin_family = AF_INET;
  66. ssin.sin_addr.s_addr = htonl(INADDR_ANY);
  67. ssin.sin_port = 0;
  68. bind (s, (struct sockaddr *)&ssin, sizeof(ssin));
  69. s=socket(AF_INET, SOCK_STREAM, 0);
  70. if (s==INVALID_SOCKET) return(4);
  71. ssin.sin_family = AF_INET;
  72. ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
  73. ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
  74. ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
  75. ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
  76. ssin.sin_port = htons(PortNum);
  77. printf(«Conecting to %d.%d.%d.%d. «,(unsigned char)hp->h_addr[0],(unsigned char)hp->h_addr[1],(unsigned char)hp->h_addr[2],(unsigned char)hp->h_addr[3]);
  78. if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) return(3);
  79. printf(«Ok\n»);
  80. strcpy(query,»GET /»);
  81. strcat(query,http_path);
  82. strcat(query,» HTTP/1.0\nHost: «);
  83. strcat(query,http_host);
  84. strcat(query,»\nUser-agent: «);
  85. strcat(query,http_user_agent);
  86. strcat(query,»\nAccept: */*\n\n»);
  87. printf(«%s»,query);
  88. if (!SendString(s,query)) return(5);
  89. char* str=GetString(s);
  90. printf(«%s»,str);
  91. return(0);
  92. >
  93. void CloseURL(void) <
  94. WSACleanup();
  95. >
  96. void main(void) <
  97. int err=OpenURL(«http://www.codenet.ru/»);
  98. if (err!=0) <
  99. printf(«Error #%d: WSABASEERR+%d\n»,err,WSAGetLastError()-WSABASEERR);
  100. >
  101. >
Читайте также:  Все эквалайзеры для windows 10

Download this code:socket.cpp

config.h

Этот модуль содержит настройки…точнее одну настройку — то что сервер получит
в качестве HTTP_USER_AGENT.

  1. char *http_user_agent=»Search Engine»;

Сокеты Windows. Пример сокетов с использованием архивов Windows Sockets: Example of Sockets Using Archives

В этой статье представлен пример использования класса CSocket. This article presents an example of using class CSocket. В примере используются CArchive объекты для сериализации данных через сокет. The example employs CArchive objects to serialize data through a socket. Обратите внимание, что это не является сериализацией документа в файл или из него. Note that this is not document serialization to or from a file.

В следующем примере показано, как использовать Архив для отправки и получения данных через CSocket объекты. The following example illustrates how you use the archive to send and receive data through CSocket objects. Этот пример разработан таким образом, что два экземпляра приложения (на одном компьютере или на разных компьютерах в сети) обмениваются данными. The example is designed so that two instances of the application (on the same machine or on different machines on the network) exchange data. Один экземпляр отправляет данные, которые другой экземпляр получает и подтверждает. One instance sends data, which the other instance receives and acknowledges. Любое приложение может инициировать обмен, а также может работать как сервер или как клиент для другого приложения. Either application can initiate an exchange, and either can act as server or as client to the other application. В классе представления приложения определена следующая функция: The following function is defined in the application’s view class:

Наиболее важным моментом в этом примере является то, что его структура параллельно работает с Serialize функцией MFC. The most important thing about this example is that its structure parallels that of an MFC Serialize function. PacketSerialize Функция члена состоит из if оператора с else предложением. The PacketSerialize member function consists of an if statement with an else clause. Функция получает две ссылки CArchive в качестве параметров: ардата и аракк. The function receives two CArchive references as parameters: arData and arAck. Если объект архива ардата задан для сохранения (отправки), if ветвь выполняется; в противном случае, если ардата установлен для загрузки (получение), функция принимает else ветвь. If the arData archive object is set for storing (sending), the if branch executes; otherwise, if arData is set for loading (receiving) the function takes the else branch. Дополнительные сведения о сериализации в MFC см. в разделе сериализация. For more information about serialization in MFC, see Serialization.

Предполагается, что объект архива аракк является противоположным для ардата. The arAck archive object is assumed to be the opposite of arData. Если ардата — для Send, аракк получает, а обратное — true. If arData is for sending, arAck receives, and the converse is true.

Для отправки функция-пример циклически обрабатывает указанное число раз, каждый раз создавая случайные данные для демонстрационных целей. For sending, the example function loops for a specified number of times, each time generating some random data for demonstration purposes. Приложение будет получать реальные данные из некоторого источника, например файла. Your application would obtain real data from some source, such as a file. Оператор вставки архива ардата ( The arData archive’s insertion operator (

Читайте также:  Arch linux icons themes

«Заголовок», указывающий природу данных (в данном случае значение переменной bValue и количество копий, которые будут отправлены). A «header» that specifies the nature of the data (in this case, the value of the bValue variable and how many copies will be sent).

Для этого примера оба элемента создаются случайным образом. Both items are generated randomly for this example.

Указанное количество копий данных. The specified number of copies of the data.

Внутренний for цикл отправляет bValue указанное число раз. The inner for loop sends bValue the specified number of times.

Строка с именем стртекст , которую получатель отображает пользователю. A string called strText that the receiver displays to its user.

Для приема функция работает аналогично, за исключением того, что она использует оператор извлечения архива ( >> ) для получения данных из архива. For receiving, the function operates similarly, except that it uses the archive’s extraction operator (>>) to get data from the archive. Принимающее приложение проверяет полученные данные, отображает окончательное сообщение «получено», а затем отправляет сообщение с текстом «Отправлено» для отображения отправляющего приложения. The receiving application verifies the data it receives, displays the final «Received» message, and then sends back a message that says «Sent» for the sending application to display.

В этой модели взаимодействия слово «получено», сообщение, отправленное в переменной стртекст , предназначено для вывода на другом конце связи, поэтому оно указывает принимающему пользователю, что было получено определенное количество пакетов данных. In this communications model, the word «Received», the message sent in the strText variable, is for display at the other end of the communication, so it specifies to the receiving user that a certain number of packets of data have been received. Получатель отвечает со сходной строкой с текстом «Отправлено» для отображения на экране исходного отправителя. The receiver replies with a similar string that says «Sent», for display on the original sender’s screen. Получение обеих строк означает, что произошла успешная связь. Receipt of both strings indicates that successful communication has occurred.

При написании клиентской программы MFC для взаимодействия с установленными серверами (не MFC) не отправляйте объекты C++ через архив. If you are writing an MFC client program to communicate with established (non-MFC) servers, do not send C++ objects through the archive. Если сервер не является приложением MFC, которое понимает типы объектов, которые требуется отправить, он не сможет получать и десериализовать объекты. Unless the server is an MFC application that understands the kinds of objects you want to send, it won’t be able to receive and deserialize your objects. Пример в статье сокеты Windows: порядок байтов показывает связь этого типа. An example in the article Windows Sockets: Byte Ordering shows a communication of this type.

Дополнительные сведения см. в разделе Спецификация сокетов Windows: хтонл, хтонс, нтохл, нтохс. For more information, see Windows Sockets Specification: htonl, htons, ntohl, ntohs. Кроме того, дополнительные сведения см. в следующих статьях: Also, for more information, see:

Оцените статью