【发布时间】:2018-07-17 03:50:52
【问题描述】:
我正在将流量(例如 UDP/TCP 数据包)从一台机器发送到另一台机器。我正在编写一个 C 应用程序,每个流量类型都有 1 个线程。我希望这两个线程同时发送数据包。
我是否需要在 sendMsg 函数中使用任何同步原语,例如互斥锁,因为它是从每个线程调用的?
sockaddr_in dest;
void * udp(void * arg){
struct * info = arg;
int fd = socket(AF_INET, SOCK_DGRAM, 0);
//set up socket info
while(1){
sendMsg(udpInfo, fd);
}
}
void * tcp(void * arg){
struct * info = arg;
int fd = socket(AF_INET, SOCK_STREAM, 0);
// set up socket info
while(1){
sendMsg(tcpInfo, fd);
}
}
void sendMsg(struct * info, int fd){
sendTo(fd, "hello", strlen("hello") + 1, 0, (struct sockaddr*)&dest, sizeof(dest));
}
【问题讨论】:
-
它不依赖任何共享的数据(假设 dest 不会改变)并且不修改任何数据,因此它不需要任何同步。
-
不适用于 UDP,但如果您不按顺序排列您的 TCP 发送,您可能会在另一端收到混合数据。 NB
sendto()使用 TCP 会忽略目标参数,并可能导致 EISCONN,除非它们为 NULL 和零。
标签: c multithreading sockets