c++多线程udp服务器
时间: 2023-09-12 14:09:54 浏览: 108
以下是一个基本的多线程UDP服务器的C++代码示例:
```c++
#include <iostream>
#include <thread>
#include <cstring>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
using namespace std;
void handle_client(int sockfd, sockaddr_in client_addr) {
char buffer[1024];
int n;
socklen_t len = sizeof(client_addr);
while (true) {
// 从客户端接收数据
n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &len);
if (n < 0) {
perror("recvfrom");
exit(1);
}
// 打印客户端发送的数据
cout << "Received message from client: " << buffer << endl;
// 发送响应数据给客户端
n = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&client_addr, len);
if (n < 0) {
perror("sendto");
exit(1);
}
}
}
int main() {
int sockfd, portno;
struct sockaddr_in serv_addr, client_addr;
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
exit(1);
}
// 初始化服务器地址
bzero((char*)&serv_addr, sizeof(serv_addr));
portno = 12345; // 服务器端口号
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
// 绑定套接字到服务器地址
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
perror("bind");
exit(1);
}
cout << "Server is running on port " << portno << endl;
while (true) {
// 从客户端接收数据
char buffer[1024];
int n;
socklen_t len = sizeof(client_addr);
n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &len);
if (n < 0) {
perror("recvfrom");
exit(1);
}
// 打印客户端发送的数据
cout << "Received message from client: " << buffer << endl;
// 创建新线程处理客户端请求
thread t(handle_client, sockfd, client_addr);
t.detach();
}
// 关闭套接字
close(sockfd);
return 0;
}
```
该程序使用了一个无限循环,不断接收来自客户端的请求,并为每个请求创建一个新线程来处理。当客户端连接时,服务器会从客户端接收数据,并将其输出到控制台。然后,服务器将相同的数据发送回客户端。注意,该程序没有任何安全特性,只是一个基本的示例程序。在实际应用中,您应该添加安全性和错误处理逻辑。
阅读全文