C++ 实现SOCKET多线程聊天小程序,要求包含一个server程序和一个client程序
时间: 2024-02-06 10:09:34 浏览: 86
C++基于socket的多线程聊天程序
4星 · 用户满意度95%
好的,下面是一个简单的C++实现SOCKET多线程聊天小程序的示例。这里提供的示例包含一个server程序和一个client程序。
首先是server程序的实现:
```cpp
#include <iostream>
#include <winsock2.h>
#include <thread>
#pragma comment(lib,"ws2_32.lib") // 链接ws2_32.lib库文件
using namespace std;
void receiveMessage(SOCKET clientSocket) {
while (true) {
char recvBuf[1024] = {0};
int ret = recv(clientSocket, recvBuf, sizeof(recvBuf), 0);
if (ret <= 0) {
cout << "recv failed" << endl;
break;
}
cout << "Client: " << recvBuf << endl;
}
}
int main() {
// 初始化WSA
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 创建socket
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 绑定IP和端口
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockAddr.sin_port = htons(12345);
bind(serverSocket, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
// 监听
listen(serverSocket, 20);
while (true) {
// 接受客户端连接
SOCKADDR clientAddr;
int nSize = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, &clientAddr, &nSize);
if (clientSocket == INVALID_SOCKET) {
cout << "accept failed" << endl;
continue;
}
// 创建接收消息的线程
thread t(receiveMessage, clientSocket);
t.detach();
// 发送消息
while (true) {
string sendBuf;
getline(cin, sendBuf);
if (sendBuf == "exit") {
break;
}
send(clientSocket, sendBuf.c_str(), sendBuf.length(), 0);
}
// 关闭socket
closesocket(clientSocket);
}
// 关闭socket
closesocket(serverSocket);
// 清理WSA
WSACleanup();
return 0;
}
```
上述代码中,我们通过`socket()`函数创建了一个SOCKET对象,并指定了IP协议、传输协议和协议类型。接着,我们通过`bind()`函数将IP地址和端口号绑定到SOCKET对象上,通过`listen()`函数将SOCKET对象设置为监听状态。
当客户端请求连接时,我们通过`accept()`函数接收客户端连接请求,并创建一个新的线程接收客户端发送的消息。在接收消息的线程中,我们通过`recv()`函数接收客户端发送的消息,并将消息输出到控制台上。
在主线程中,我们通过`send()`函数向客户端发送消息,同时可以通过输入`exit`来退出程序。
接下来是client程序的实现:
```cpp
#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") // 链接ws2_32.lib库文件
using namespace std;
int main() {
// 初始化WSA
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 创建socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 连接服务器
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sockAddr.sin_port = htons(12345);
connect(clientSocket, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
// 发送消息
while (true) {
string sendBuf;
getline(cin, sendBuf);
if (sendBuf == "exit") {
break;
}
send(clientSocket, sendBuf.c_str(), sendBuf.length(), 0);
}
// 关闭socket
closesocket(clientSocket);
// 清理WSA
WSACleanup();
return 0;
}
```
上述代码中,我们通过`socket()`函数创建了一个SOCKET对象,并指定了IP协议、传输协议和协议类型。接着,我们通过`connect()`函数将SOCKET对象连接到服务器上。
当连接成功后,我们通过`send()`函数向服务器发送消息,同时可以通过输入`exit`来退出程序。
需要注意的是,在编译这两个程序时,需要链接`ws2_32.lib`库文件。
以上就是一个简单的C++实现SOCKET多线程聊天小程序的示例,希望对你有所帮助。
阅读全文