TCP - протокол передачи данных на IP датаграммах. Проще говоря - IP протокол передает данные, а TCP поверх него управляет и контролирует доставку. Так как сам протокол IP не гарантирует доставку данных, то TCP интерфейс считает отправленные и полученные данные, а в случае потери данных делает необходимое для повторной отправки. Обмен данными по протоколу TCP возможен как между приложениями на одном компьютере, так и между приложениями на разных удаленных компьютерах или устройствах. Именно поэтому он является основой в современном мире передачи данных от встраиваемых систем в локальных сетях до сетей Интернет. Самая известная  часть TCP это - Socket, который принято называть - конечной точкой. С простой точки зрения Socket являет собой некий идентификатор, связующим звеном между клиентом и сервером, с помощью которого происходит обмен данными. Socket содержит в себе IP адрес в целом, и номер порта в частности. Каждое приложение, если нужно, способно общаться с внешним миром через свой собственный порт. Если двум одновременно работающим приложениям присвоить одинаковые номера портов - это вызовет конфликт в одном из приложений при попытке использовать уже занятый порт. Рассмотрим простое консольное приложение которое связывается с сервером и читает его страницу. По сути это простой "Клиент" который инициирует общение, отправляет данные (например HTTP запрос) по которым сервер понимает чего от него хотят (например -  вернуть веб страницу). Чтоб не загромождать код, в нем упущены условия в случае ошибки, поэтому перед запуском клиента нужно убедиться что сервер работает
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 запрос к серверу) и буфер для текстового ответа от сервера.
- #define WIN32_LEAN_AND_MEAN
 - #include <conio.h>
 - #include <winsock2.h>
 - #include <ws2tcpip.h>
 - #include "stdafx.h"
 - using namespace std;
 - #pragma comment (lib, "Ws2_32.lib")
 - #define DEFAULT_BUFLEN 4048
 - #define DEFAULT_PORT "80"
 - int main()
 - {
 - WSADATA wsaData;
 - SOCKET ConnectSocket = INVALID_SOCKET;
 - struct addrinfo *result, hints;
 - char sendbuf[] = "GET http://ivarious.xyz HTTP/1.0 \r\n\r\n ";
 - char recvbuf[DEFAULT_BUFLEN]=" ";
 - int recvbuflen = DEFAULT_BUFLEN;
 - WSAStartup(MAKEWORD(2, 2), &wsaData);
 - ZeroMemory(&hints, sizeof(hints));
 - hints.ai_family = AF_INET;
 - hints.ai_socktype = SOCK_STREAM;
 - hints.ai_protocol = IPPROTO_TCP;
 - getaddrinfo("77.222.42.240", DEFAULT_PORT, &hints, &result);
 - ConnectSocket = 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);
 - printf("%s", recvbuf);
 - closesocket(ConnectSocket);
 - WSACleanup();
 - _getch();
 - return 0;
 - }
 
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 запрос к серверу) и буфер для текстового ответа от сервера.


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