udp多个线程同时发送数据c/c++、
时间: 2024-05-03 10:19:41 浏览: 95
在C/C++中,可以使用多线程同时发送UDP数据。以下是一个示例代码:
```c++
#include <winsock2.h>
#include <stdio.h>
#include <process.h>
#pragma comment(lib, "ws2_32.lib")
#define THREAD_NUM 10
DWORD WINAPI SendThread(LPVOID lpParameter);
int main(int argc, char* argv[])
{
// 初始化Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
// 创建套接字
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
printf("socket failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
// 设置服务器地址
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 创建多个线程发送数据
HANDLE hThreads[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++) {
hThreads[i] = CreateThread(NULL, 0, SendThread, (LPVOID)sock, 0, NULL);
}
// 等待所有线程结束
WaitForMultipleObjects(THREAD_NUM, hThreads, TRUE, INFINITE);
// 关闭套接字
closesocket(sock);
// 清理Winsock
WSACleanup();
return 0;
}
DWORD WINAPI SendThread(LPVOID lpParameter)
{
SOCKET sock = (SOCKET)lpParameter;
// 发送数据
const char* buf = "hello";
int len = strlen(buf);
int iResult = sendto(sock, buf, len, 0, (sockaddr*)&serverAddr, sizeof(serverAddr));
if (iResult == SOCKET_ERROR) {
printf("sendto failed: %d\n", WSAGetLastError());
return 1;
}
return 0;
}
```
在此示例中,我们创建了10个线程来同时发送UDP数据。每个线程都是使用`CreateThread`函数创建的,每个线程都执行`SendThread`函数来发送数据。注意,我们需要将套接字作为参数传递给`SendThread`函数。
在`SendThread`函数中,我们使用`sendto`函数来发送UDP数据。我们可以将服务器地址和端口号保存在全局变量`serverAddr`中,以便在每个线程中重复使用。
最后,我们使用`WaitForMultipleObjects`函数等待所有线程结束,并在主函数中关闭套接字和清理Winsock。
阅读全文