Developer от Бога

DV

четверг, 6 июля 2017 г.

TCP/IP. Socket

TCP - протокол передачи данных на IP датаграммах. Проще говоря - IP протокол передает данные, а TCP поверх него управляет и контролирует доставку. Так как сам протокол IP не гарантирует доставку данных, то TCP интерфейс считает отправленные и полученные данные, а в случае потери данных делает необходимое для повторной отправки. Обмен данными по протоколу TCP возможен как между приложениями на одном компьютере, так и между приложениями на разных удаленных компьютерах или устройствах. Именно поэтому он является основой в современном мире передачи данных от встраиваемых систем в локальных сетях до сетей Интернет. Самая известная  часть TCP это - Socket, который принято называть - конечной точкой. С простой точки зрения Socket являет собой некий идентификатор, связующим звеном между клиентом и сервером, с помощью которого происходит обмен данными. Socket содержит в себе IP адрес в целом, и номер порта в частности. Каждое приложение, если нужно, способно общаться с внешним миром через свой собственный порт. Если двум одновременно работающим приложениям присвоить одинаковые номера портов - это вызовет конфликт в одном из приложений при попытке использовать уже занятый порт. Рассмотрим простое консольное приложение которое связывается с сервером и читает его страницу. По сути это простой "Клиент" который инициирует общение, отправляет данные (например HTTP запрос) по которым сервер понимает чего от него хотят (например -  вернуть веб страницу). Чтоб не загромождать код, в нем упущены условия в случае ошибки, поэтому перед запуском клиента нужно убедиться что сервер работает



  1. #define WIN32_LEAN_AND_MEAN
  2. #include <conio.h> 
  3. #include <winsock2.h>
  4. #include <ws2tcpip.h>
  5. #include "stdafx.h"
  6. using namespace std;

  7. #pragma comment (lib, "Ws2_32.lib")

  8. #define DEFAULT_BUFLEN 4048
  9. #define DEFAULT_PORT "80"

  10. int main()
  11. {
  12. WSADATA wsaData;
  13. SOCKET ConnectSocket = INVALID_SOCKET;
  14. struct addrinfo *result, hints;
  15. char sendbuf[] = "GET http://ivarious.xyz HTTP/1.0 \r\n\r\n ";
  16. char recvbuf[DEFAULT_BUFLEN]=" ";
  17. int recvbuflen = DEFAULT_BUFLEN;

  18. WSAStartup(MAKEWORD(2, 2), &wsaData);

  19. ZeroMemory(&hints, sizeof(hints));
  20. hints.ai_family = AF_INET;
  21. hints.ai_socktype = SOCK_STREAM;
  22. hints.ai_protocol = IPPROTO_TCP;

  23. getaddrinfo("77.222.42.240", DEFAULT_PORT, &hints, &result);

  24. ConnectSocket = socket(result->ai_family, result->ai_socktype,result->ai_protocol);
  25. connect(ConnectSocket, result->ai_addr, (int)result->ai_addrlen);
  26. send(ConnectSocket, sendbuf, sizeof(sendbuf), 0);
  27. recv(ConnectSocket, recvbuf, DEFAULT_BUFLEN, 0);

  28. printf("%s", recvbuf);

  29. closesocket(ConnectSocket);
  30. WSACleanup();

  31. _getch();

  32. return 0;
  33. }




WSAStartup(MAKEWORD(2, 2), &wsaData) - инициализация библиотеки TCP.
struct addrinfo - структура с данными адреса и некоторыми настройками.
getaddrinfo("77.222.42.240", DEFAULT_PORT, &hints, &result) - обрабатывает строки IP адреса и порта к нужному виду.

socket(result->ai_family, result->ai_socktype,result->ai_protocol);
connect(ConnectSocket, result->ai_addr, (int)result->ai_addrlen) - создание и подключение сокета.
send(ConnectSocket, sendbuf, sizeof(sendbuf), 0) и recv(ConnectSocket, recvbuf, DEFAULT_BUFLEN, 0) соответственно отправка данных (HTTP запрос к серверу) и буфер для текстового ответа от сервера.

Комментариев нет:

Отправить комментарий