如果你不喜欢或者不能让socket阻塞工作,那可以如下改进:1.使用非阻塞然后自己去查询EWOULDBLOCK, 2.使用select模型,3.使用多线程。
当然,windows下有更多选择WM异步甚至完成端口。
我以前也贴过select的代码,但是还是每次看到它都想说点什么,大概是真的不常用加上我觉得很多人会对他有神秘感而想体验一下而遇到问题得原因吧。
select是一种查询,查询我所询问的socket上有没有应该处理的事件,当然,由于berkely socket内部没有区分连接socket和数据socket,所以你要自己处理事件是连接还是数据,好在这没什么难的,你自己建立的socket你一定知道它是哪个类型。
注意:查询我所询问的socet上有没有应该处理的事件。这有几个问题:
1.我所询问,那这个询问是如何投放的。
使用FD_SET可以将指定一个socket添加到特定的兴趣集fl_set里。(注意区分大小写,大写的是方法,小写的是一个结构)。
2.如何询问。
这个很简单,就是使用select方法了。
3.如何分析询问到的结果。
可以用FD_ISSET查询特定一个socket是否在有事件的fd_set集里。
4.注意,使用前一定要清理并初始化。
清理使用FD_ZERO,初始化就是添加新的socket了,对,使用FD_SET。