Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Общая схема работы с сокетами в 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; просмотров: 441; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.102 (0.006 с.) |