扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1.将打开的socket设为非阻塞的,可以用fcntl(socket, F_SETFL, O_NDELAY)完成(有的系统用FNEDLAY也可).

我们提供的服务有:网站制作、成都网站建设、微信公众号开发、网站优化、网站认证、漳平ssl等。为上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的漳平网站制作公司
2.发connect调用,这时返回-1,但是errno被设为EINPROGRESS,意即connect仍旧行还没有完成.
3.将打开的socket设进被监视的可写(注意不是可读)文件集合用select进行监视,如果可写用getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, sizeof(int)); 来得到error的值,如果为零,则connect成功.
大家知道,tcp的读和写是阻塞的,即读的时候不知道什么时候读完,写的时候不知道什么时候写完,因此线程就一直暂停在哪里,一般tcp程序用在上位机下位机之间对吧!下位机一些设备一般会发心跳报文给我们机器,假设为10s发一次吧,当机器超过10s没接收到数据,那么我们就要考虑把socket断开,因为不断开的话设备重新连接可能又会建立新的socket,这样如果设备反复断开连接的话,将产生大量的socket,占用大量系统资源,这里我们用socket.setSoTimeout(500)方法解决read方法的阻塞问题,同时设定一个标志位,在异常处理程序当中退出socket连接:
InputStream is = null;
OutputStream os = null;
int flag = 0;
try {
socket.setSoTimeout(500); // 0.5秒就退出read()方法的阻塞
is = socket.getInputStream();
os = socket.getOutputStream();
} catch (Exception e2) {
e2.printStackTrace();
阻塞socket和非阻塞socket的区别: 1、读操作 对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返回。
当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数。阻塞socket和非阻塞socket的区别: 1、读操作 对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返回。当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数。质都是一样的
SocketChannel属于nio,支持异步非阻塞连接.当然Socket也可以自己来实现非阻塞连接.
一般来说使用SocketChannel会有更好的性能(Socket实际应该比SocketChannel更高效,不过一般使用到最后,由于使用者设计等原因,效率反而比直接使用SocketChannel低)
到此,以上就是小编对于windows设置socket非阻塞的问题就介绍到这了,希望这4点解答对大家有用。

我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流