当前位置:  技术问答>linux和unix

突然发现Linux下socket的怪异之处!

    来源: 互联网  发布时间:2017-03-09

    本文导语:  本帖最后由 Lamb0145 于 2012-08-06 20:07:26 编辑 有两点奇怪的地方。 第一、阻塞模式下,无accept,connect返回成功       背景:connect运行在阻塞模式下,服务端也是阻塞的,只能接收一个客服端的请求。       问...

本帖最后由 Lamb0145 于 2012-08-06 20:07:26 编辑
有两点奇怪的地方。

第一、阻塞模式下,无accept,connect返回成功

      背景:connect运行在阻塞模式下,服务端也是阻塞的,只能接收一个客服端的请求。

      问题:服务端运行在死循环里,当接收到一个客户端连接后,accept并进入交互。此时再有一个客户端连接上来,connect返回成功,发送消息被缓存起来,等待第一个客户端退出后。服务端accept与此客户端建立连接。

      问题是都没accept,应该connect不成功才对,原因是啥?如果是listen放到缓存队列里的话,那怎么样可以不缓存,让connect直接返回失败!
      
第二、非阻塞模式下,connect均返回失败

      非阻塞模式下,本地客户端连接本地服务端,服务端accept成功,但客户端connect返回失败。远程客户端连接本地服务端,连不上。。。是何原因。代码整理之后贴出来

|
问题1:判断一个连接的成功是三次握手,三次握手成功后才进行accept。在listen的时候其实有两个队列,一个是已经完成三次握手的队列,就是连接成功,还有一个是等待三次握手的队列。所有connect成功跟有无accept无关。
问题2:当connect在非阻塞的模式下时,并没有等待三次握手的成功,所有返回失败。如果想用connect的非阻塞模式,可以配合select使用。

|
1.对于listen第二个参数的问题,有两点需要理解一下:1.第二个参数的理解:对于listen的第二个参数参数从未有过正是的定义。一种说法是两个队列的总和的最大值;另一种说法是已完成连接的队列的长度,再乘以一个模糊因子就是总的长度,模糊因子为1.5,不管哪种说法,只是让我们理解的一种手段。2.当listen队列已满的时候,当客户端再发送一个SYN,TCp就会忽略此分节,并且不发送RST。客户TCP将重发SYN,期望不久就能在队列中找到空闲条目。

那么你的listen设置为1,并且多个客户端连接依然没有问题就好理解了。

|
第一、阻塞模式下,无accept,connect返回成功
====
这个很正常,listen后,系统内部会接受连接,connect就会成功。但是如果服务器一直不accept,然后多客户端不停的connect,最终会失败。

第二、非阻塞模式下,connect均返回失败
====
非阻塞模式下,connect失败是很正常的,在connect不能立即完成时,就会返回错误,但是连接的过程会继续,这时需要用select来检查连接是否完成(成功或失败)
http://developerweb.net/viewtopic.php?id=3196
[EINPROGRESS]
    O_NONBLOCK is set for the file descriptor for the socket and the connection cannot be immediately established; the connection will be established asynchronously. 

    
 
 

您可能感兴趣的文章:

  • 昨天发现fcntl设置非阻塞SOCKET会频繁的失败,不知道什么原因.
  • read一个socket, 发现read到的长度是0, 是否一定代表对方调用了close关闭了socket?
  • 刚接触linux,发现安装好后通过grep memtotal查询发现比实际物理内存小。
  • 如何查看linux现在有没有发现机器的内猫?
  • 发现一个Linux牛人的博客
  • 我发现在Redhat Linux中有个选项可以连上MSN,不知怎么才可以连上,谢谢
  • ~发现在国内关于linux的教材真的很少~
  • 搜索别的的时候,发现了这个:“将 MFC 应用程序移植到 Linux”
  • SOS!我装好LINUX后发现中文全变成了乱码,请各位学兄赐教!
  • linux 下设置环境变量 使用了setenv 和putenv 在程序结束以后 发现变量又变回去了
  • 听说freebsd很强大,但我发现好像是unix的。。可我现在想学linux。。unix/linux有什么区别。。请高人指点
  • 现在我用c语言在linux下写一个服务端程序现发现了内存泄漏问题
  • 刚装了redhat Linux9,进入csdn发现左边的目录是乱码,我是新手请大家帮帮忙,谢谢!
  • linux下使用无线模块wifi发现不了网卡
  • 重大发现!广州地铁的闸门机的操作系统---Linux !
  • 我按了Slax Linux V5.1.8.1版,但是浏览网页时发现了一个严重的问题!!
  • 急,急,急!!!在linux下Apache配置完成后,发现80端口被用掉了,如何才能知道被哪个进程用掉。
  • 在Windows下通过Telnet登陆到FedoraCore3时发现中文都是乱码,而Linux下Shell里的中文可以正常显示
  • 同事新装的suse linux server 11,在装好后发现原来160G的硬盘只能加载15G,谁知道怎么挂载余下的硬盘呀?
  • 请问:我正在编linux下的openssl程序,调试时要用443号端口,但我发现不通,应是linux系统占用了,我怎可停了它以作我用,或停了系统的openssl
  • 我通国光盘安装了CENTOS4.4 但发现没有安装上LINUX源码 不知道 则么安装上去阿
  • 我用virtual pc装linux 9.0时,最后正常启动时发现图像极其模糊!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 调查发现微信存在漏洞:冒充微信助手骗密码
  • 网络发现与配置工具 NeDI
  • netstat发现TIME_WAIT
  • 发现jcertify4.0答案有错误,同意者请举手
  • 蓝牙设备发现工具 Bluelog
  • 如何发现服务具体是哪个进程占用CPU高?
  • 网络设备自动发现工具 Observer
  • 通过JdbcOdbcDriver连接Access出现“未发现数据源名称并且未指定默认驱动程序”
  • 在非GUI程序中,我用JOptionPane.showMessageDialog后,发现程序无法结束。why?
  • 我下载了Fedora3,发现了一个奇怪的问题
  • 写了一个处理大量文本的程序,发现跑一段时间以后大量的吃掉内存。
  • 怎么回事,打开本页,瑞星报告发现病毒!!!
  • ipmsg采用无线点对点的模式,为什么不能发现用户!
  • 发现一个有趣的东西,继续散分。
  • 增加 虚拟硬盘 后发现没有起作用
  • top查看CPU 发现top本身占用率奇高
  • 发现一个 bug 赏黄金千两!
  • 高手帮帮忙!!! 在线等!!outlook的附件修改且保存后,再次打开发现是修改之前的原件
  • 重大发现!!!!
  • 我在看一个GNU软件时发现有这么一句,不明白什么意思
  • 重装RH9后发现的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3