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 запрос к серверу) и буфер для текстового ответа от сервера.
Комментариев нет:
Отправить комментарий