大致流程是这样的,
客户端使用 connect连接
服务器端
bind
listen(sock, SOMAXCONN)
for(;;)
{
accept do something... 处理连接
}但在实际使用中发现有时会连接不上,我用sniffer抓包,发现连接失败时实际上是TCP三次握手失败。客户端 SYN 包已经发出,但就是没有收到服务器的SYN/ACK 包
然后客户端两次重发SYN包(Retransmission of Frame 3272), 依旧没有收到SYN/ACK包后宣告失败。因为并不是一台客户端电脑有这个问题,而且IE浏览器访问服务器上的WEB没有问题,所以应该排除线路问题。请问大侠1)什么时候服务器才发回SYN/ACK,是accept前还是accept后?
2)do something... 处理连接部分如果效率低下是否有影响
3)是什么造成服务器无法发回SYN/ACK包。谢谢高手指点!

解决方案 »

  1.   

    accept有没有堵塞?
    把do somthing那些语句去掉会怎么样?
      

  2.   

    我抓了一下FTP的包,发现FTP应频繁连服务器,它为何没有问题呢?高手支招啊!
      

  3.   

    在怎么样握手也是在Accept中阿!
    如果后面的do somthing 作的事情太多了,Accept也忙不过来了
      

  4.   

    调整一下pending connections的上限值
    listen(local_socket, 5);
    =>
    listen(local_socket, 500);
      

  5.   

    客户端发起连接后,服务器端需要保证在多少时间内Accept?我开多个线程同时侦听一个端口是否可以。
    用SO_REUSEADDR
      

  6.   

    Accept只处理连接,根据连接开线程就好了
      

  7.   

    listen函数的第二个参数不是你想用多少就是多少,能处理的同时连接数量是有限的。
    还有,同意 aben456(快要升级了&& hunting job) 
    最好不要在for循环中处理,为每一个连接开一个线程试试
      

  8.   

    应该是你的连接缓冲区满了,你说别人FTP服务器怎么没事情,那是因为FTP服务器将事务处理与接收连接分开了
      

  9.   

    谢谢各位,经过检查发现基本原因可能是出口NAT路由器受到了一些病毒的干扰,对一些频繁的连接造成影响。我现在用开启多个accept线程来处理,虽然没有完全解决这个问题,但也明白了一些东西,原来的循环是不正确的。FTP的数据连线也是发送一个文件后断开连接,新的文件再重新连接这种方式。这个通过sniffer可以观察到。用FTP传没有问题确实是一大疑惑。