请教高手,SOCKET接收阻塞和发送非阻塞

feiying2222 2009-12-21 11:06:50
各位大侠,我在程序中使用了SOCKET UDP编程,未使用I/O模型,大家都知道默认情况下SOCKET是阻塞的,因此我创建的接收线程里放置了recvfrom并通过不断循环(阻塞)接收网络数据,在时码板的中断中sendto发送数据。
前几天发现了这一情况,当服务器未开机时,我使用sendto每次发送1024字节以上的数据帧时,总要阻塞几秒钟(因为性能要求高,程序几乎不能发生任何阻塞,否则影响时码板中断造成程序死慢),因此我就把socket设置为非阻塞模式,sendto不阻塞了,但是新问题又来了recvfrom的接收线程由于非阻塞不断地循环,造成程序CPU占用100%。
请问这种情况一定要使用I/O模型才能解决吗?我的目标是“接收阻塞,发生不阻塞!”,仅此而已!
先谢谢了!
...全文
1098 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Majingliang7 2010-11-09
  • 打赏
  • 举报
回复
Socket IPC
labelll 2010-09-03
  • 打赏
  • 举报
回复
最近再做Socket IPC通信,看到这么多说socket有问题的帖子,我都有点不敢下手了。sigh.
labelll 2010-09-03
  • 打赏
  • 举报
回复
如果是用socket IPC通信,是不是就没这么多问题了?
tyg111 2010-07-08
  • 打赏
  • 举报
回复
正在学习中
雨焰 2010-06-25
  • 打赏
  • 举报
回复
没看懂啊!唉!
tonghua205 2010-02-01
  • 打赏
  • 举报
回复
123
sue3140 2010-02-01
  • 打赏
  • 举报
回复
学习学习,最近也在搞着东西,烦躁中。。。
feiying2222 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]
而且我给了你一个完整的解决方法,你还在说“可能”干吗?!:)引用 10 楼 feiying2222 的回复:
引用 8 楼 arong1234 的回复:
这可能就要好一点,没有分包、一致性大麻烦
解决的办法是:把socket设置成非阻塞的,这样发送没问题。接收使用select语句检查可读性,这样接收由select确保阻塞性即可

阿荣兄,那就是说还是可能要用到SOCKET I/O模型这个问题才比较好解决?

[/Quote]
呵呵,谢谢阿荣兄了,但是项目组其他人对SOCKET I/O模型看法不一,我现在要找到比较好的解决方案才能让人信服
arong1234 2009-12-21
  • 打赏
  • 举报
回复
而且我给了你一个完整的解决方法,你还在说“可能”干吗?!:)[Quote=引用 10 楼 feiying2222 的回复:]
引用 8 楼 arong1234 的回复:
这可能就要好一点,没有分包、一致性大麻烦
解决的办法是:把socket设置成非阻塞的,这样发送没问题。接收使用select语句检查可读性,这样接收由select确保阻塞性即可

阿荣兄,那就是说还是可能要用到SOCKET I/O模型这个问题才比较好解决?
[/Quote]
arong1234 2009-12-21
  • 打赏
  • 举报
回复
我估计没有任何一个io模型会按照你这种方式做,select自己不属于任何io模型吧
[Quote=引用 10 楼 feiying2222 的回复:]
引用 8 楼 arong1234 的回复:
这可能就要好一点,没有分包、一致性大麻烦
解决的办法是:把socket设置成非阻塞的,这样发送没问题。接收使用select语句检查可读性,这样接收由select确保阻塞性即可

阿荣兄,那就是说还是可能要用到SOCKET I/O模型这个问题才比较好解决?
[/Quote]
feiying2222 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 arong1234 的回复:]
这可能就要好一点,没有分包、一致性大麻烦
解决的办法是:把socket设置成非阻塞的,这样发送没问题。接收使用select语句检查可读性,这样接收由select确保阻塞性即可
[/Quote]
阿荣兄,那就是说还是可能要用到SOCKET I/O模型这个问题才比较好解决?
feiying2222 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
这不仅仅是你这端无所谓的问题,socket的两端都必须确保数据的正确性。

假如你和服务器约定按照1,2,3的顺序发数据,如果按照你的方法,最大的可能是发送了1,3,但是2没发,这样有可能导致socket两端程序都崩溃
引用 4 楼 feiying2222 的回复:
楼上的高手,先谢谢了!
“第二:你所谓的socket发送不阻塞,实际上是数据根本不可靠的发送出去,也就是当你不阻塞发送时,很多数据根本没有发送出去,这往往不是你设计的本意。所以你所谓解决发送不阻塞的问题的方法是在逻辑和结果都错误的前提下的解决,实际是一个虚假的解决。 ”

先谢谢阿荣兄,这么晚了还来答疑。
1.是这样的,服务器和我的程序之间是无耦合的,我只管发送数据,不管服务器的接收情况,“如果按照你的方法,最大的可能是发送了1,3,但是2没发,”即使2没有发,服务器也是不会崩溃的。
2.其实我的程序主线程是不会变慢的,因为我的发送本来就在时码板的中断线程当中,是不会影响到主线程的,但问题是阻塞把时码板的中断线程变慢了,造成时码板中断减慢
arong1234 2009-12-21
  • 打赏
  • 举报
回复
这可能就要好一点,没有分包、一致性大麻烦
解决的办法是:把socket设置成非阻塞的,这样发送没问题。接收使用select语句检查可读性,这样接收由select确保阻塞性即可

[Quote=引用 6 楼 feiying2222 的回复:]
引用 3 楼 mengde007 的回复:
连接服务器时候莫非要ioctl一下;
而后连接成功了再改回来;

关键是程序总体是基于UDP的设计,不需要做connect工作的,直接sendto
[/Quote]
arong1234 2009-12-21
  • 打赏
  • 举报
回复
这不仅仅是你这端无所谓的问题,socket的两端都必须确保数据的正确性。

假如你和服务器约定按照1,2,3的顺序发数据,如果按照你的方法,最大的可能是发送了1,3,但是2没发,这样有可能导致socket两端程序都崩溃
[Quote=引用 4 楼 feiying2222 的回复:]
楼上的高手,先谢谢了!
“第二:你所谓的socket发送不阻塞,实际上是数据根本不可靠的发送出去,也就是当你不阻塞发送时,很多数据根本没有发送出去,这往往不是你设计的本意。所以你所谓解决发送不阻塞的问题的方法是在逻辑和结果都错误的前提下的解决,实际是一个虚假的解决。 ”

我的目标确实是“接收阻塞,发生非阻塞”,因为当对端服务器没有开机时,我发送数据不可靠的发出去我也无所谓啊,我要保证的是时码板的中断线程不受到阻塞的影响而变慢。
[/Quote]
feiying2222 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mengde007 的回复:]
连接服务器时候莫非要ioctl一下;
而后连接成功了再改回来;
[/Quote]
关键是程序总体是基于UDP的设计,不需要做connect工作的,直接sendto
feiying2222 2009-12-21
  • 打赏
  • 举报
回复
现在先问下通过SOCKET I/O模型是否可以解决这个问题呢?其实我的程序SOCKET大致也就20几个,但要同时收发,此时应用哪种模型好一些?
feiying2222 2009-12-21
  • 打赏
  • 举报
回复
楼上的高手,先谢谢了!
“第二:你所谓的socket发送不阻塞,实际上是数据根本不可靠的发送出去,也就是当你不阻塞发送时,很多数据根本没有发送出去,这往往不是你设计的本意。所以你所谓解决发送不阻塞的问题的方法是在逻辑和结果都错误的前提下的解决,实际是一个虚假的解决。 ”

我的目标确实是“接收阻塞,发生非阻塞”,因为当对端服务器没有开机时,我发送数据不可靠的发出去我也无所谓啊,我要保证的是时码板的中断线程不受到阻塞的影响而变慢。
mengde007 2009-12-21
  • 打赏
  • 举报
回复
连接服务器时候莫非要ioctl一下;
而后连接成功了再改回来;
arong1234 2009-12-21
  • 打赏
  • 举报
回复
解决这个问题的方法不是用你这种方法,而是把发送放到一个单独的线程中去,用队列来缓冲发送数据,这样既不阻塞你自己的主线程,数据最终也能发送出去。
socket是个很复杂的东西,三言两语无法说清楚,我当年学了半年才算完全懂,我估计你也无法在两天内通过几个网贴明白
arong1234 2009-12-21
  • 打赏
  • 举报
回复
第一:socket自己无法实现发送非阻塞,接收非阻塞,
第二:你所谓的socket发送不阻塞,实际上是数据根本不可靠的发送出去,也就是当你不阻塞发送时,很多数据根本没有发送出去,这往往不是你设计的本意。所以你所谓解决发送不阻塞的问题的方法是在逻辑和结果都错误的前提下的解决,实际是一个虚假的解决。

这个东西没法教你,只好你自己慢慢理解了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧