"要实现一个可连网的聊天软件,你需要使用网络编程和socket编程来建立客户端和服务器之间的通信。以下是一个简单的示例代码:\n\n客户端代码:\ncpp\n#include <iostream>\n#include <string>\n#include <WS2tcpip.h>\n#pragma comment (lib, \"ws2_32.lib\")\n\nint main() {\n std::string ipAddress = \"127.0.0.1\"; // 服务器IP地址\n int port = 54000; // 服务器端口号\n\n // 初始化Winsock\n WSADATA data;\n WORD version = MAKEWORD(2, 2);\n int wsOk = WSAStartup(version, &data);\n if (wsOk != 0) {\n std::cerr << \"无法初始化Winsock\" << std::endl;\n return -1;\n }\n\n // 创建socket\n SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);\n if (sock == INVALID_SOCKET) {\n std::cerr << \"无法创建socket\" << std::endl;\n WSACleanup();\n return -1;\n }\n\n // 设置服务器地址和端口\n sockaddr_in hint;\n hint.sin_family = AF_INET;\n hint.sin_port = htons(port);\n inet_pton(AF_INET, ipAddress.c_str(), &(hint.sin_addr));\n\n // 连接到服务器\n int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));\n if (connResult == SOCKET_ERROR) {\n std::cerr << \"无法连接到服务器\" << std::endl;\n closesocket(sock);\n WSACleanup();\n return -1;\n }\n\n // 循环接收和发送消息\n char buf[4096];\n std::string userInput;\n\n do {\n // 接收消息\n ZeroMemory(buf, 4096);\n int bytesReceived = recv(sock, buf, 4096, 0);\n if (bytesReceived > 0) {\n std::cout << \"服务器: \" << std::string(buf, 0, bytesReceived) << std::endl;\n }\n\n // 发送消息\n std::cout << \"> \";\n std::getline(std::cin, userInput);\n int sendResult = send(sock, userInput.c_str(), userInput.size() + 1, 0);\n if (sendResult == SOCKET_ERROR) {\n std::cerr << \"无法发送消息\" << std::endl;\n break;\n }\n\n } while (true);\n\n // 关闭socket\n closesocket(sock);\n\n // 清理Winsock\n WSACleanup();\n\n return 0;\n}\n\n\n服务器端代码:\ncpp\n#include <iostream>\n#include <string>\n#include <WS2tcpip.h>\n#pragma comment (lib, \"ws2_32.lib\")\n\nint main() {\n std::string ipAddress = \"127.0.0.1\"; // 本地IP地址\n int port = 54000; // 监听端口号\n\n // 初始化Winsock\n WSADATA data;\n WORD version = MAKEWORD(2, 2);\n int wsOk = WSAStartup(version, &data);\n if (wsOk != 0) {\n std::cerr << \"无法初始化Winsock\" << std::endl;\n return -1;\n }\n\n // 创建socket\n SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);\n if (listening == INVALID_SOCKET) {\n std::cerr << \"无法创建socket\" << std::endl;\n WSACleanup();\n return -1;\n }\n\n // 设置服务器地址和端口\n sockaddr_in hint;\n hint.sin_family = AF_INET;\n hint.sin_port = htons(port);\n inet_pton(AF_INET, ipAddress.c_str(), &(hint.sin_addr));\n\n // 绑定socket到IP地址和端口\n bind(listening, (sockaddr*)&hint, sizeof(hint));\n\n // 开始监听连接\n listen(listening, SOMAXCONN);\n std::cout << \"服务器开始监听连接...\" << std::endl;\n\n // 等待连接\n sockaddr_in client;\n int clientSize = sizeof(client);\n SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);\n char host[NI_MAXHOST]; // 客户端名字\n char service[NI_MAXSERV]; // 客户端服务(端口)号\n ZeroMemory(host, NI_MAXHOST);\n ZeroMemory(service, NI_MAXSERV);\n\n if (getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0) {\n std::cout << host << \"连接到服务器\" << std::endl;\n }\n else {\n inet_ntop(AF_INET, &(client.sin_addr), host, NI_MAXHOST);\n std::cout << host << \"连接到服务器\" << std::endl;\n }\n\n // 关闭监听socket\n closesocket(listening);\n\n // 循环接收和发送消息\n char buf[4096];\n while (true) {\n ZeroMemory(buf, 4096);\n\n // 接收消息\n int bytesReceived = recv(clientSocket, buf, 4096, 0);\n if (bytesReceived == SOCKET_ERROR) {\n std::cerr << \"接收消息时出错\" << std::endl;\n break;\n }\n\n if (bytesReceived == 0) {\n std::cout << \"客户端断开连接\" << std::endl;\n break;\n }\n\n std::cout << \"客户端: \" << std::string(buf, 0, bytesReceived) << std::endl;\n\n // 发送消息\n send(clientSocket, buf, bytesReceived + 1, 0);\n }\n\n // 关闭socket\n closesocket(clientSocket);\n\n // 清理Winsock\n WSACleanup();\n\n return 0;\n}\n\n\n以上代码是一个简单的聊天软件示例,可以在本地运行。你可以根据需要对其进行修改和扩展,以满足具体要求。\n\n\n\n


原文地址: https://www.cveoy.top/t/topic/pYUL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录