Общая схема работы с сокетами в Windows 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Общая схема работы с сокетами в Windows



Клиент

· Инициализация WSA

· Создание сокета

· Присоединение к серверу

· Прием/передача данных

· Разрыв соединения

Сервер

· Инициализация WSA

· Создание слушающего сокета и привязка к порту

· Прослушивание порта

· Обработка входящих подключений

· Прием/передача данных

· Разрыв соединения

 

Пример. Клиентское и серверное приложение

КЛИЕНТ:

#include < winsock2.h >

#include < ws2tcpip.h >

#include < iostream >

 

#define ip "127.0.0.1"

#define port 27015

#define bufsize 256

 

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

 

int main()

{

setlocale(LC_ALL, "Russian");

//Инициализация WSA

WSADATA wsaData;

int result;

result = WSAStartup(MAKEWORD(2, 2), &wsaData);

if (result!= 0)

{

std::cout << "Ошибка WSAStartup: " << result << std::endl;

return 1;

}

 

//Создание сокета

SOCKET clientSocket = INVALID_SOCKET;

clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (clientSocket == INVALID_SOCKET)

{

std::cout << "Ошибка socket(): " << WSAGetLastError() << std::endl;

WSACleanup();

return 1;

}

 

//Присоединение к серверу

 

sockaddr_in clientService;

clientService.sin_family = AF_INET;

clientService.sin_addr.s_addr = inet_addr(ip);

clientService.sin_port = htons(port);

 

result = connect(

clientSocket,

reinterpret_cast< SOCKADDR* >(&clientService),

sizeof(clientService)

);

if (result!= 0)

{

std::cout << "Ошибка в connect(): " << WSAGetLastError() << std::endl;

WSACleanup();

return 1;

}

 

//Передача данных серверу

char data[] = "Test";

result = send(clientSocket, data, static_cast< int >(strlen(data)), 0);

if (result < 0)

{

std::cout << "Ошибка в send(): " << WSAGetLastError() << std::endl;

return 1;

}

 

//Прием данных от сервера

char buf[bufsize];

int r;

do

{

r = recv(clientSocket, buf, bufsize, 0);

if (r > 0)

std::cout << "Приянтно " << r << " байт" << std::endl;

else if (r == 0)

std::cout << "Соединение разорвано" << std::endl;

else

std::cout << "Ошибка в recv(): " << WSAGetLastError() << std::endl;

} while (r > 0);

 

//Разрыв соединения

closesocket(clientSocket);

// Если работа с сокетами больше не предполагается вызываем WSACleanup()

WSACleanup();

return 0;

}

СЕРВЕР:

#include < winsock2.h >

#include < ws2tcpip.h >

#include < iostream >

 

#define DEFAULT_PORT "27015"

#define DEFAULT_BUFLEN 512

 

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

 

int main()

{

setlocale(LC_ALL, "Russian");

//Инициализация WSA

int iResult;

 

WSAData d;

iResult = WSAStartup(MAKEWORD(2, 2), &d);

if (iResult!= 0)

{

std::cout << "Error at WSAStartup: " << iResult;

return 1;

}

 

//Подготовка данных для создания сокета

struct addrinfo *result = NULL, *ptr = NULL, hints;

ZeroMemory(&hints, sizeof (hints));

hints.ai_family = AF_INET;

hints.ai_socktype = SOCK_STREAM;

hints.ai_protocol = IPPROTO_TCP;

hints.ai_flags = AI_PASSIVE;

 

iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);

if (iResult!= 0)

{

std::cout << "Ошибка getaddrinfo: " << iResult;

WSACleanup();

return 1;

}

 

//Создание сокета

SOCKET listenSocket = INVALID_SOCKET;

listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);

if (listenSocket == INVALID_SOCKET)

{

std::cout << "Error at socket(): " << WSAGetLastError();

freeaddrinfo(result);

WSACleanup();

return 1;

}

 

//Связывание сокета с сетвевым адресом

iResult = bind(listenSocket, result->ai_addr, result->ai_addrlen);

if (iResult == SOCKET_ERROR)

{

std::cout << "Bind failed with error: " << WSAGetLastError();

freeaddrinfo(result);

closesocket(listenSocket);

WSACleanup();

return 1;

}

 

freeaddrinfo(result);

 

//Прослушивание подключений

if (listen(listenSocket, SOMAXCONN) == SOCKET_ERROR)

{

std::cout << "Listen failed with error: " << WSAGetLastError();

closesocket(listenSocket);

WSACleanup();

return 1;

}

 

//Обработка запроса на подключение

SOCKET ClientSocket;

 

ClientSocket = INVALID_SOCKET;

 

ClientSocket = accept(listenSocket, NULL, NULL);

if (ClientSocket == INVALID_SOCKET)

{

std::cout << "Accept failed with error: " << WSAGetLastError();

closesocket(listenSocket);

WSACleanup();

return 1;

}

 

//Обмен данными

char recvbuf[DEFAULT_BUFLEN];

int iSendResult;

int recvbuflen = DEFAULT_BUFLEN;

 

do

{

// Принимаем данные от клиента

iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);

if (iResult > 0)

{

std::cout << "Принято " << iResult << " байт" << std::endl;

 

// Отправляем данные, принтые от клиента, обратно

iSendResult = send(ClientSocket, recvbuf, iResult, 0);

if (iSendResult == SOCKET_ERROR)

{

std::cout << "Send failed with error: " << WSAGetLastError();

closesocket(ClientSocket);

WSACleanup();

return 1;

}

std::cout << "Отправлено " << iSendResult << " байт";

}

else if (iResult == 0)

std::cout << "Соединение закрыто..." << std::endl;

else

{

std::cout << "Ошибка recv " << WSAGetLastError();

closesocket(ClientSocket);

WSACleanup();

return 1;

}

} while (iResult > 0);

 

}

 



Поделиться:


Последнее изменение этой страницы: 2016-12-11; просмотров: 322; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.30.118 (0.01 с.)