我需要重复向套接字发送和接收UDP数据报。我的想法是产生两个线程,一个负责发送,另一个负责接收。只有当一个线程可以在阻塞recv()
上等待并且另一个线程同时在同一个套接字上执行send()
时,整个想法才有意义。
我做了一些谷歌搜索,发现了这个问题:Are parallel calls to send/recv on the same socket valid?接受的答案提到send()
和recv()
是线程安全的(哇......),但接着是一个惊人的评论:
这并不一定意味着它们将并行执行
糟糕。这是否意味着如果我实现了我的多线程创意,我是否会在发送线程等待接收线程的recv()
在实际开始发送数据之前返回?坏。
这个被接受的答案是否仅涉及两个并行的send()
是不明确的,或者对于尝试并行执行一个send()
和一个recv()
的问题,这是不确定的。因此:
两个线程对同一套接字上的send()
的调用和recv()
的调用是否会被并行执行,或者其中一个调用会阻塞,直到另一个返回?
答案 0 :(得分:0)
简短回答:你应该可以使用相同的套接字句柄来发送和接收单独的线程。
常见的情况是视频会议应用程序。您可能希望从麦克风录制一个线程并从udp端口发送音频。另一个线程在同一端口上接收数据包并通过扬声器播放它们。
如果您的协议更加同步(即请求/响应流 - 为了发送,您首先必须先收到一些东西),然后从设计角度来看,单个可能的线程更有意义。