现在的位置: 首页 > 综合 > 正文

阻塞socket与非阻塞的socket

2013年10月21日 ⁄ 综合 ⁄ 共 1128字 ⁄ 字号 评论关闭

 我来回答一下这个问题。。。
首先在创建socket,,然后绑定什么就不说了,,,然后listen 监听前面创建的socket(你可以把listen当然是后台运行的监控一样)

listen语句之后一般会有accept。这个是接受连接请求的。
当监听到有连接请求来的时候,,,accept就会 重新创建一个socket(注意,该socket才是真正用来通信的)。。。。。。。

到这里楼主可明白了。。。。前面自己创建的socket只是用来listen(监听)的。。只有当监听到有连接请求时,并且accept函数接受了连接,才会创建一个新的socket。。这个新建的是用来通信的(明白)

那阻塞与非阻塞是什么情况呢? 这个只是针对accept来有意义。就是说,默认情况下,accept函数是阻塞的,就是说,在没有新连接请求来的情况下(listen监听),accept一直在这里等,函数没有返回,也就是说,卡在这个地方而不会创建新的socket,程序不会往下运行。。一旦有连接请求过来,则马上答应连接,并自行创建一个新socket,accept的返回值就是socket这值。相当于文件描述符性质。。。。

  非阻塞,用户可以设置(fcntl函数), 这种情况下,accept函数,在没有连接请求来的情况下,马上会返回,也就是说不会在这里等,程序就会往下运行,返回值会一个负数。也就是说socket没有创建成功。。。。

总的来说,用来通信的socket 是accept函数的返回值,只有真连接来的时候,accept才会返回一个正确的值,这个返回值就是socket的描述符。

 阻塞情况下,,没有连接请求来的时候,一直卡在这里,不会有返回值,也就没有创建socket,直到有请求。
非阻塞情况下,不管你有没有连接来,返正accept函数会马上执行完,并返回一个值。。当没有请求时,返回的是负数,也就是说这个socket是错误的,不可用。有请求的时候返回正数,这个就是socket描述符。

 

异步socket 发送 send发送不出去,提示错误25解决办法:

 

 IO pending 或系统buffer填满

非阻塞socket send不出数据的原因有2个:TCP连接断开了和该socket处在阻塞状态(也就是说在发送数据中),UDP发不出,只有后面的情况就是发送中;

处理的方法就是记录下socket状态,当状态为阻塞时放入缓冲,当socket再次可写时发送!

 

在accept 时:非阻塞socket  没有连接的情况下马上返回一个负数,不等待,如果有连接的话 会返回一个正确的值,即SOCKET描述符!

                             阻塞socket  在没有连接的情况下一直等待,不会返回值!

 

抱歉!评论已关闭.