阻塞socket与非阻塞的socket(转载)

我来回答一下这个问题。。。
首先在创建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描述符。

 

 

测试发现阻塞和非阻塞read都会直接返回(好像和书上讲的不是很一致),好像阻塞和非阻塞真的只对accept有效,这一点不是很清楚,希望高手解释一下.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值