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

Linux 下非阻塞式Socket 连接问题

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

    本文导语:  有一个客户端和服务端程序,服务端监听: 172.16.128.72:55771,accept成功一个后,不再accpet  ,客户端用非阻塞式socket去 连接对端(先connect,成功情况下用select 再查询)。 问题是:启动多个客户端程序连接服务...

有一个客户端和服务端程序,服务端监听: 172.16.128.72:55771,accept成功一个后,不再accpet  ,客户端用非阻塞式socket去 连接对端(先connect,成功情况下用select 再查询)。

问题是:启动多个客户端程序连接服务端,客户端均连接成功, 是什么原因呢?

通过netstat 查询如下:
服务端:

netstat -a |grep 55771
tcp        0      0 f1s9:55771              *:*                     LISTEN
tcp        0      0 f1s9:55771              f1s8:56699              SYN_RECV
tcp        0      0 f1s9:55771              f1s8:48426              SYN_RECV
tcp        0      0 f1s9:55771              f1s8:53168              ESTABLISHED
tcp        0      0 f1s9:55771              f1s8:58658              ESTABLISHED
tcp        0      0 f1s9:55771              f1s8:59174              ESTABLISHED
tcp        0      0 f1s9:55771              f1s8:47150              ESTABLISHED
tcp        0      0 f1s9:55771              f1s8:53550              ESTABLISHED


客户端:
 netstat -a |grep 55771
tcp        0      0 f1s8:53550              f1s9:55771              ESTABLISHED
tcp        0      0 f1s8:56699              f1s9:55771              ESTABLISHED
tcp        0      0 f1s8:53168              f1s9:55771              ESTABLISHED
tcp        0      0 f1s8:59174              f1s9:55771              ESTABLISHED
tcp        0      0 f1s8:58658              f1s9:55771              ESTABLISHED
tcp        0      0 f1s8:47150              f1s9:55771              ESTABLISHED
tcp        0      0 f1s8:48426              f1s9:55771              ESTABLISHED




|
因为accept发生在3次握手成功建立TCP连接之后,
而建立TCP连接后,connect就已经返回成功了,
accept只是从已连接的TCP队列中取一个绑到fd上返回,
不管有没有accept,都不影响3次握手(connect).

|


TCP协议栈会自动建立好连接,服务端应用程序是否调用accept,对此事不影响,
打个比方,你有5个手机,有3个人同时给你给其中3个手机打电话,3个手机都响了,
你接(accept)了其中一个,另外两个没有接,但是另外两个打电话的人,能听见"嘟"声,
或者听见你的彩铃,他们知道电话打通了,只是没有人接。

线路通或不通,是运营商(协议栈)的事情,两人沟通却是自己(应用层)的事情,
这就需要用两人都懂的方式(上层协议, 如HTTP)交谈了,可以是普通话,也可以是英语。

|


对方没有accept,是客户端应用层收不到回复的充分不必要条件,

即使对方已经accept并且回复数据了,也有多个原因能造成客户端收不到回复,

所以光凭借这点是无法判断对方有没有accept的,客户端不应过分关心服务端的非业务逻辑部分。

如果应用层出现这种需求,可能需要再斟酌斟酌。一般不需要做这样的判断,只管计时和收发数据,

如果超时,就可以认为服务因为某些原因不可用了,例如浏览器打开一个页面时,有时会看到超时提示.

至于超时的原因,浏览器不会细说,也不会去尝试分析,只是做到提示“超时”这么个粒度。

|
ACCEPT(2)                  Linux Programmer's Manual                 ACCEPT(2)

NAME
       accept - accept a connection on a socket

SYNOPSIS
       #include           /* See NOTES */
       #include 

       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

DESCRIPTION
       The  accept()  system  call  is used with connection-based socket types
       (SOCK_STREAM,  SOCK_SEQPACKET).   It  extracts  the  first   connection
       request  on  the  queue of pending connections, creates a new connected
       socket, and returns a new file descriptor  referring  to  that  socket.
       The  newly  created socket is not in the listening state.  The original
       socket sockfd is unaffected by this call.

       The argument sockfd is a socket that has been created  with  socket(2),
       bound to a local address with bind(2), and is listening for connections
       after a listen(2).

|
你的netstat显示,已经accept了,tcp握手成功,至于你说没成功,我想你的判断失误了。
你如何判断没成功?你后面又说多个客户端成功,那说明服务端没问题。
但是你一会儿说成功,一会儿说不成功,把俺搞晕了。

|
你一次accept都不运行试试,一样会连接成功,accept是从已连接队列里取出连接。

|
建议用google.com搜索以下关键字,找几篇相关王章看看

tcp backlog

tcp syncookie

tcp three-way handshake

|


正解

    
 
 

您可能感兴趣的文章:

  • Linux下read函数默认到底是阻塞的还是非阻塞的?
  • linux 如何用SOCKET设置函数设置阻塞和非阻塞?
  • linux C socke编程 创建的socket默认是阻塞的还是非阻塞的?
  • 请问:我发现在linux上的网络编程时, 若客户端连不上服务端,就会阻塞,但如果是在UNIX上,若连不上,会马上返回,并不阻 塞,怎样让它也能阻塞啊?
  • linux fwrite 阻塞问题
  • linux多线程无法进行阻塞方式的读写操作
  • linux下socket的send函数阻塞问题?
  • Linux里的pthread_create会不会阻塞啊?
  • linux socket fd 写阻塞问题
  • Linux系统刚启动起来的时候为什么会阻塞一下?
  • linux shell如何非阻塞写命名管道
  • linux sem_wait 为什么会阻塞进程?
  • linux下消息队列不阻塞
  • 如何linux 程序中启用其他进程,非阻塞,非popen
  • Linux线程阻塞问题 高手请进
  • linux多线程无法进行阻塞方式的读写操作?
  • linux下如何设置一个socket为非阻塞方式?
  • 在Linux下如何等待线程终止,又不会阻塞
  • linux下的非阻塞读取
  • linux epoll的ET模式和LT模式的主要区别是什么呢?为什么ET模式一定要用非阻塞socket?
  • 在XP下使用VMWare安装了Linux AS 5.6之后,使用FTP工具可以远程连接Linux,而在cmd命令行中却连接不上,什么原因 ?
  • linux 有线连接了却显示有线连接断开是怎么回事
  • 请问unix/linux下动态连接库和静态连接库有什么区别?
  • LINUX中连接C++的库怎么连接.库在什么位置,还有什么特殊命令吗?
  • 在linux下可以使用dao方式连接数据库吗?可以连接musql吗?回答就给分!急
  • 在线请教:linux下用MySQL C API 连接MySQL 4.1.12出现的连接问题,提示升级客户端!!!!!!
  • ftp连接问题,就是linux连接windows ftp的问题,高手请进(在线等待)!!!!!
  • Linux下的C++程序怎么连接WIN2000下的SQL Server 2000?或者如何连接MySQL?
  • linux 下连接创建连接数据库程序,什么都可以 。谁知道300分
  • [疑问] [linux网络连接]Linuxmint网络连接
  • LINUX C 进行TCP网络连接,怎样设置连接超时时间?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SSL握手通信详解及linux下c/c++ SSL Socket代码举例
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • linux socket programe 同一个IP下 bind 多个socket,可以不??
  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • ★★★LINUX与windows的网络编程socket有多大区别?
  • linux下socket编程问题!
  • Linux 下用什么函数查找socket上一次的错误?
  • 求助!!linux下socket编程
  • 请问,在linux下如何探测socket端口通不通啊?
  • 关于LINUX内部socket
  • linux下用socket实现多进程间通信问题?
  • 请教: linux下用c++写最简单的socket程序如何写?
  • 想搞linux下的socket编程,请大家给些意见^_^
  • 如何清楚linux系统中以退出程序的socket连接?
  • 急!!请教关于linux socket编程的一个问题!!
  • 问个linux下raw socket的问题
  • 哪里有linux下的c++的socket库????
  • windows 与 linux socket 编程问题
  • 在linux下,我的socket为什么小于零?
  • 请问有没有Linux下SOCKET服务端和客户端的接口函数!!
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


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

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

    浙ICP备11055608号-3