Narg, идентификатор не был объявлен, идентификатор написан с ошибками, заголовок, в котором объявлен идентификатор, не включен в файл, или в идентификаторе отсутствует квалификатор области, например, cout вместо std::cout
вообще на будущее - тыкаешь на код ошибки и у тебя отдельная страница от майков открывается тут у тебя переменной нет, она должна иметь тип uint16_t. например, объяви так uint16_t local_port = 1337; C uint16_t local_port = 1337; источник
#include <iostream> #include <winsock2.h> #include <thread> #pragma comment(lib, "ws2_32.lib") void receive_data(SOCKET sock) { while (true) { char buffer[256]; int recv_len = recv(sock, buffer, sizeof(buffer), 0); if (recv_len > 0) { buffer[recv_len] = '\0'; std::cout << "Key pressed: " << buffer << std::endl; } } } int main(int argc, char* argv[]) { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in sockAddr; sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); sockAddr.sin_port = htons(local_port); bind(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); listen(sock, 1); SOCKET clientSock = accept(sock, nullptr, nullptr); std::thread receiver(receive_data, clientSock); receiver.join(); closesocket(sock); closesocket(clientSock); WSACleanup(); return 0; } C #include <iostream> #include <winsock2.h> #include <thread> #pragma comment(lib, "ws2_32.lib") void receive_data(SOCKET sock) { while (true) { char buffer[256]; int recv_len = recv(sock, buffer, sizeof(buffer), 0); if (recv_len > 0) { buffer[recv_len] = '\0'; std::cout << "Key pressed: " << buffer << std::endl; } } } int main(int argc, char* argv[]) { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in sockAddr; sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); sockAddr.sin_port = htons(local_port); bind(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); listen(sock, 1); SOCKET clientSock = accept(sock, nullptr, nullptr); std::thread receiver(receive_data, clientSock); receiver.join(); closesocket(sock); closesocket(clientSock); WSACleanup(); return 0; }
nsw, на первый взгляд, проблем в коде нет, но есть несколько моментов, которые можно улучшить необходимо добавить обработку ошибок для функций bind() и listen(), можно использовать макросы WSAGetLastError() и perror(): if (bind(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR) { perror("bind failed"); closesocket(sock); WSACleanup(); return 1; } if (listen(sock, 1) == SOCKET_ERROR) { perror("listen failed"); closesocket(sock); WSACleanup(); return 1; } Код if (bind(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR) { perror("bind failed"); closesocket(sock); WSACleanup(); return 1; } if (listen(sock, 1) == SOCKET_ERROR) { perror("listen failed"); closesocket(sock); WSACleanup(); return 1; } в функции receive_data() нет обработки ошибок при вызове recv(). Если recv() завершается с ошибкой, программа может продолжить работу и неожиданно завершиться позже. думаю нужно проверить, что значение recv_len не равно SOCKET_ERROR и recv_len не равно 0. если recv_len равно SOCKET_ERROR, то необходимо обработать ошибку, например, закрыть сокеты и завершить программу int recv_len = recv(sock, buffer, sizeof(buffer), 0); if (recv_len == SOCKET_ERROR) { perror("recv failed"); closesocket(sock); WSACleanup(); return 1; } else if (recv_len == 0) { std::cout << "Connection closed" << std::endl; closesocket(sock); WSACleanup(); return 0; } else { buffer[recv_len] = '\0'; std::cout << "Key pressed: " << buffer << std::endl; } Код int recv_len = recv(sock, buffer, sizeof(buffer), 0); if (recv_len == SOCKET_ERROR) { perror("recv failed"); closesocket(sock); WSACleanup(); return 1; } else if (recv_len == 0) { std::cout << "Connection closed" << std::endl; closesocket(sock); WSACleanup(); return 0; } else { buffer[recv_len] = '\0'; std::cout << "Key pressed: " << buffer << std::endl; } в текущей реализации поток receiver не останавливается, когда клиент закрывает соединение. Необходимо добавить проверку на завершение соединения и остановить поток, когда это происходит. это можно сделать, например, путем добавления проверки на значение recv_len в функцию receive_data(): void receive_data(SOCKET sock) { while (true) { char buffer[256]; int recv_len = recv(sock, buffer, sizeof(buffer), 0); if (recv_len == SOCKET_ERROR) { perror("recv failed"); closesocket(sock); return; } else if (recv_len == 0) { std::cout << "Connection closed" << std::endl; closesocket(sock); return; } else { buffer[recv_len] = '\0'; std::cout << "Key pressed: " << buffer << std::endl; } } } Код void receive_data(SOCKET sock) { while (true) { char buffer[256]; int recv_len = recv(sock, buffer, sizeof(buffer), 0); if (recv_len == SOCKET_ERROR) { perror("recv failed"); closesocket(sock); return; } else if (recv_len == 0) { std::cout << "Connection closed" << std::endl; closesocket(sock); return; } else { buffer[recv_len] = '\0'; std::cout << "Key pressed: " << buffer << std::endl; } } }