Клиентское и серверное приложение с использованием сокетов на C++
И так, для того, чтобы написать любое приложение, которое работает с сокетами в Windows, необходимо включить в ваш проект файл winsock2.h и библиотеку WS2_32.lib В Microsoft Visual C++ Express edition. Это можно сделать так: Проект -> Свойства проекта -> Свойства конфигурации -> Компоновщик -> Ввод и в поле “Дополнительные зависимости” нужно вписать имя библиотеки.
И так, код сервера:
#include <winsock2.h> #include <stdio.h> int main(void) { WORD sockVer; WSADATA wsaData; int retVal; sockVer = MAKEWORD(2,2); WSAStartup(sockVer, &wsaData); //Создаем сокет SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(servSock == INVALID_SOCKET) { printf("Unable to create socket\n"); WSACleanup(); return SOCKET_ERROR; } SOCKADDR_IN sin; sin.sin_family = PF_INET; sin.sin_port = htons(1111); sin.sin_addr.s_addr = INADDR_ANY; retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin)); if(retVal == SOCKET_ERROR) { printf("Unable to bind\n"); WSACleanup(); return SOCKET_ERROR; } //Пытаемся начать слушать сокет retVal = listen(servSock, 10); if(retVal == SOCKET_ERROR) { printf("Unable to listen\n"); WSACleanup(); return SOCKET_ERROR; } //Ждем клиента SOCKET clientSock; clientSock = accept(servSock, NULL, NULL); if(clientSock == INVALID_SOCKET) { printf("Unable to accept\n"); WSACleanup(); return SOCKET_ERROR; } char szReq[8]; retVal = recv(clientSock, szReq, 8, 0); if(retVal == SOCKET_ERROR) { printf("Unable to recv\n"); return SOCKET_ERROR; } printf("Got the request from client\n%s\n",szReq); char *szResp = "Response"; printf("Sending response from server\n"); retVal = send(clientSock, szResp, strlen(szResp), 0); if(retVal == SOCKET_ERROR) { printf("Unable to send\n"); return SOCKET_ERROR; } //Закрываем сокет closesocket(clientSock); closesocket(servSock); WSACleanup(); return 0; } |
Код клиента:
#include <stdio.h> #include <winsock2.h> int main() { WORD ver = MAKEWORD(2,2); WSADATA wsaData; int retVal=0; WSAStartup(ver,(LPWSADATA)&wsaData); LPHOSTENT hostEnt; hostEnt = gethostbyname("localhost"); if(!hostEnt) { printf("Unable to collect gethostbyname\n"); WSACleanup(); return 1; } //Создаем сокет SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(clientSock == SOCKET_ERROR) { printf("Unable to create socket\n"); WSACleanup(); return 1; } SOCKADDR_IN serverInfo; serverInfo.sin_family = PF_INET; serverInfo.sin_addr = *((LPIN_ADDR)*hostEnt->h_addr_list); serverInfo.sin_port = htons(1111); retVal=connect(clientSock,(LPSOCKADDR)&serverInfo, sizeof(serverInfo)); if(retVal==SOCKET_ERROR) { printf("Unable to connect\n"); WSACleanup(); return 1; } printf("Connection made sucessfully\n"); char *pBuf = "Request"; printf("Sending request from client\n"); retVal = send(clientSock, pBuf, strlen(pBuf), 0); if(retVal == SOCKET_ERROR) { printf("Unable to send\n"); WSACleanup(); return 1; } char szResponse[9]; retVal = recv(clientSock, szResponse, 9, 0); if(retVal == SOCKET_ERROR) { printf("Unable to recv\n"); WSACleanup(); return 1; } printf("Got the response from server\n%s\n",szResponse); closesocket(clientSock); WSACleanup(); return 0; } |
Более подробное описание методов можно найти здесь
Понравилась статья? Жми: | Поделиться в соц. сетях |