写Linux c语言创建线程组播收发数据代码
时间: 2024-12-22 15:28:32 浏览: 4
在 Linux C 语言中,创建一个线程用于组播收发数据通常涉及到网络编程和多线程技术。这里是一个简单的示例,展示了如何使用 POSIX 标准库的 `pthread` 和 `socket` API 来创建和管理线程。这个例子假设你已经熟悉基本的网络编程和结构体如 `struct sockaddr_in`:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAX_THREADS 5
#define GROUP_IP "224.0.0.1" // 组播地址
#define PORT 1234
// 线程函数原型
void* thread_function(void* arg);
// 创建并启动线程
void start_threads(int num_threads) {
pthread_t threads[MAX_THREADS];
int i;
for (i = 0; i < num_threads; i++) {
if (pthread_create(&threads[i], NULL, thread_function, NULL)) {
perror("Error creating thread");
exit(1);
}
}
// 等待所有线程完成
for (i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}
}
// 线程函数主体,这里只是一个接收广播的例子
void* thread_function(void* unused) {
int sock, new_sock;
struct sockaddr_in group_addr, from_addr;
char buffer[1024];
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == -1) {
perror("Failed to create socket");
return NULL;
}
// 设置组播选项
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group_addr, sizeof(group_addr));
// 永久阻塞,直到接收到数据
while (true) {
socklen_t from_len = sizeof(from_addr);
new_sock = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&from_addr, &from_len);
if (new_sock > 0) {
printf("Received data: %s\n", buffer);
} else {
perror("recvfrom failed");
}
}
close(sock);
return NULL;
}
int main() {
int num_threads = 2; // 设置线程数量
start_threads(num_threads);
printf("Main thread is done.\n");
return 0;
}
阅读全文