// cn-lab2-server.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include #include #include #include #include #pragma comment(lib, "ws2_32.lib") using namespace std; int client_processing(SOCKET my_sock, const sockaddr_in client_addr, const int client_addr_size, char recv_buff[]) { int a, b, c; stringstream ss; ss << recv_buff; ss >> a >> b >> c; string triangle_exist = "false"; if ((a < b + c) && (b < a + c) && (c < a + b)) triangle_exist = "true"; sendto(my_sock, triangle_exist.c_str(), triangle_exist.length(), 0, (sockaddr *)&client_addr, client_addr_size); cout << "Answer sent" << endl; return 0; } int port_listen(SOCKET my_sock) { while (true) { sockaddr_in client_addr; int client_addr_size = sizeof(client_addr); char recv_buff[1024]; int len = recvfrom(my_sock, &recv_buff[0], sizeof(recv_buff) - 1, 0, (sockaddr *)&client_addr, &client_addr_size); if (len < 0) return 0; cout << "Request received" << endl; recv_buff[len] = '\0'; thread client(client_processing, my_sock, client_addr, client_addr_size, recv_buff); } return 0; } int main() { cout << "cn-lab2 var10 server start" << endl; WSAData wsadata; WSAStartup(0x0202, &wsadata); cout << "Winsock2 initialized" << endl; SOCKET my_sock; my_sock = socket(AF_INET, SOCK_DGRAM, 0); if (my_sock == INVALID_SOCKET) { cout << "Create socket error " << WSAGetLastError() << endl; WSACleanup(); return 1; } cout << "Socket created successfully" << endl; sockaddr_in local_addr; local_addr.sin_family = AF_INET; local_addr.sin_addr.S_un.S_addr = 0; local_addr.sin_port = htons(5002); if (::bind(my_sock, (sockaddr *)&local_addr, sizeof(local_addr))) { cout << "Error bind " << WSAGetLastError() << endl; closesocket(my_sock); WSACleanup(); return 2; } cout << "Binding successful" << endl; thread listen(port_listen, ref(my_sock)); string s; do { cin >> s; } while (s != "stop"); shutdown(my_sock, SD_BOTH); closesocket(my_sock); if (listen.joinable()) listen.join(); listen.~thread(); WSACleanup(); return 0; }