效果展示 Cpp服务端源码TIPS:以下程序使用同一台主机演示。
服务端开启多线程,等待多个客户端连接。
#define _WINSOCK_DEPRECATED_NO_WARNINGS #includeCpp客户端源码#include //C++11线程库 //Windows网络库 #include //引入socket动态库,win下可以,但不能跨平台 #pragma comment (lib,"ws2_32.lib") using std::cout; using std::endl; using std::cin; int main() { system("chcp 65001");//防止乱码 WSADATA wsaData; //在window下面需要额外的加载socket库 if (SOCKET_ERROR == WSAStartup(MAKEWORD(2, 2), &wsaData)) { cout << "WSAStartup 启动失败 " << GetLastError() << endl; return 0; } SOCKET serverSock = socket(AF_INET, SOCK_STREAM, 0); if (INVALID_SOCKET == serverSock) { cout << "创建socket失败 " << GetLastError() << endl; return 0; } SOCKADDR_IN ServerAddr; ServerAddr.sin_family = AF_INET; ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ServerAddr.sin_port = htons(7890); if (SOCKET_ERROR == bind(serverSock, (sockaddr *)&ServerAddr, sizeof(SOCKADDR_IN))) { cout << "bind 失败 " << GetLastError() << endl; return 0; } if (INVALID_SOCKET == listen(serverSock, 5)) { cout << "监听失败 " << GetLastError() << endl; return 0; } while (true) { cout << "等待用户连接 " << endl; SOCKADDR_IN clientAddr; int clientAddrLen = sizeof(SOCKADDR_IN); SOCKET clientSock = accept(serverSock, (sockaddr *)&clientAddr, &clientAddrLen); cout << "连接成功: SOCKET: " << clientSock << " ip:" << inet_ntoa(clientAddr.sin_addr) << " port:" << ntohs(clientAddr.sin_port) << endl; //多线程 面向多个客户端 //TIPS:如果将accept模块部分载入多线程,意味着将开启无限多个线程等待客户端的进入,那是没有意义的。 std::thread t([clientSock]() { //向连接的客户端收发数据 while (true) { //收发数据 char buffer[1024]{ 0 }; int nRecv = recv(clientSock, buffer, 1024, 0); int nSend = send(clientSock, buffer, nRecv, 0); if (nRecv <= 0) break; cout << "收到的数据长度: " << nRecv << " 收到的数据为:" << buffer << endl; } closesocket(clientSock); cout << "关闭客户端" << endl; }); t.detach(); } closesocket(serverSock); //卸载Windows动态网络库 WSACleanup(); system("pause"); return 0; }
客户端可随机向服务端发送数据,服务端返回其收到的数据给该客户端。
#define _WINSOCK_DEPRECATED_NO_WARNINGS #include#include #pragma comment(lib,"ws2_32.lib") //引入socket动态库,win下可以,但不能跨平台 using std::cout; using std::endl; using std::cin; int main() { system("chcp 65001");//防止中文乱码 WSADATA wsaData; int nRet = WSAStartup(MAKEWORD(2, 2), &wsaData); if (SOCKET_ERROR == nRet) { cout << "WASStartUp 启动失败" << GetLastError() << endl; return 0; } SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0); if (INVALID_SOCKET == clientSock) { cout << "创建socket失败 " << GetLastError() << endl; return 0; } SOCKADDR_IN serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); serverAddr.sin_port = htons(7890); //connect内部自动给客户端绑定了一个随机端口 if (INVALID_SOCKET == connect(clientSock, (sockaddr *)&serverAddr, sizeof(SOCKADDR_IN))) { cout << "连接服务端失败 " << GetLastError() << endl; return 0; } while (true) { char buffer[1024]{ 0 }; cout << "请输入: "; cin >> buffer; if (buffer[0] == 'q')break; int nSendLen = send(clientSock, buffer, strlen(buffer), 0); int nRecvLen = recv(clientSock, buffer, 1024, 0); if (nRecvLen <= 0) break; cout << "收到的长度 " << nRecvLen << " 数据:" << buffer << endl; } closesocket(clientSock); WSACleanup();//卸载动态网络库 system("pause"); return 0; }



