Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 364; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.15.185.147 (0.008 с.) |