【问题标题】:Concurrently sending packets同时发送数据包
【发布时间】:2018-07-18 03:13:09
【问题描述】:

我是 C 新手,想了解多线程如何与套接字一起工作。

我了解如何创建线程,但我不了解它们在这种情况下是如何工作的。

两个线程同时接收数据包。 当第一个线程进入receiveData函数,调用recvmsg()时,第二个线程会不会一直阻塞,直到第一个线程收到数据包并退出receiveData函数?

有没有办法防止额外的线程被阻塞?

void * tcp (void * arg){
    struct * info = arg;
    // set up socket fd
    fd = socket(AF_INET, SOCK_STREAM, 0);
    while(True){
        receiveData(info, fd);
    }
}

void * icmp (void * arg){
    struct * info = arg;
    // set up socket fd
    fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    while(True){
        receiveData(info, fd);
    }
}

//function that is called by thread 1 and thread 2 concurrently
void receiveData(struct * info, int fd){
    int val = recv(fd, buf, 1000, 0);
}

【问题讨论】:

  • 这取决于操作系统、版本、套接字类型和套接字的状态(数据挂起等)。一般来说内核不会让任何“坏”发生,但我很确定结果是不确定的。你应该发一个minimal reproducible example
  • int val = receiveData(info, fd); 无效,因为 receiveData() 返回 void。

标签: c multithreading sockets


【解决方案1】:

当您有两个这样的独立套接字时,它们是独立的——第一个线程将阻塞直到其套接字上的数据可用,而第二个线程将阻塞直到其套接字上的数据可用。如果数据到达一个套接字而不是另一个,则阻塞在数据到达的套接字上的线程将解除阻塞(recv 将返回)并循环直到没有更多数据可用。如果数据到达两个套接字,则两个线程将继续并循环。

【讨论】:

  • 即使只有一个套接字和必须响应的请求(可以并行,即使数据包是按顺序接收的),在响应准备好之前还有一些工作要做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
相关资源
最近更新 更多