当前位置: 技术问答>linux和unix
求助:阻塞socket在多线程情况下的防护问题
来源: 互联网 发布时间:2016-11-25
本文导语: 由于条件限制,必须用阻塞UDP socket,同时有跨平台的需求,所以不考虑TCP,以及select和poll模型。 socket需要双向工作,每周期除了从多个外部节点接收数据,还要发送数据,所以放在同一个任务里肯定是不行的,必...
由于条件限制,必须用阻塞UDP socket,同时有跨平台的需求,所以不考虑TCP,以及select和poll模型。
socket需要双向工作,每周期除了从多个外部节点接收数据,还要发送数据,所以放在同一个任务里肯定是不行的,必须要保证即使收不到数据,还要能发出数据。
因此我创建了两个任务:recvtask,sendtask,一个只负责收数据,一个负责发数据。
因为操作的是同一个socket,现在观察调试起来会出问题,经常判断sendto返回的长度>0,但下一句打印出来看却是-1,或者阻塞发送的时候出现HOSTDOWN的错误。总之表现不太正常。按理说阻塞模型下,如果底层协议栈暂时无法完成发送数据的请求,会一直在sendto阻塞,而不是出错吧?
请教各位高手,这种情况下需要对socket对象做多任务防护吗?如果做的话怎么实现呢(我分析这是矛盾的,即如果对recvfrom过程进行防护,则在recvfrom返回前,sendto操作是无法得到锁的)?
socket需要双向工作,每周期除了从多个外部节点接收数据,还要发送数据,所以放在同一个任务里肯定是不行的,必须要保证即使收不到数据,还要能发出数据。
因此我创建了两个任务:recvtask,sendtask,一个只负责收数据,一个负责发数据。
因为操作的是同一个socket,现在观察调试起来会出问题,经常判断sendto返回的长度>0,但下一句打印出来看却是-1,或者阻塞发送的时候出现HOSTDOWN的错误。总之表现不太正常。按理说阻塞模型下,如果底层协议栈暂时无法完成发送数据的请求,会一直在sendto阻塞,而不是出错吧?
请教各位高手,这种情况下需要对socket对象做多任务防护吗?如果做的话怎么实现呢(我分析这是矛盾的,即如果对recvfrom过程进行防护,则在recvfrom返回前,sendto操作是无法得到锁的)?
|
不冲突,
很久很久以前是冲突,那是因为那时的网卡是单工或者半双工的。
|
貌似读写不冲突吧
你是两个进程,还是两个线程?
你是两个进程,还是两个线程?
|
两个任务同时操作一个socket会不会有同步、互斥的问题。
介意用一个任务,用及select或poll就能达到效果
介意用一个任务,用及select或poll就能达到效果