各位高手
  我在做一网络通讯程序的过程中,由于用户并发量非常大,当服务器同时连接数超过一定数量时(大约在500个左右),客户端不能连接服务器,报错:(
无法打开到主机的连接 在端口 6666 : 连接失败)。此时socket资源可能已被耗尽,有很多的tcp连接状态为TIME_WAIT, 待一段时间过后,socket资源已释放后,连接该服务器,还是报错(无法打开到主机的连接 在端口 6666 : 连接失败), 现在服务器已进入拒绝服务状态!
  请问高手,
  1、为何socket资源在释放后,还是不能连接?
  2、如何解释拒绝服务?
  
  在此多谢了!

解决方案 »

  1.   

    建议使用完成端口模型.
    在SOCKET上保持尽可能多的ACCEPTEX调用,使每个连接请求都立即被响应.
      

  2.   

    由于你的等待连接太多,Accept接收队列已经满了.
    我以前也碰到过类似问题.
    后来的解决方法是每次Accept完后重新调AsyncSelect函数,
    还有一种方法是每次Accept的时候设置一定数量的循环,保证缓冲区里没有等待连接的Socket为止.
      

  3.   

    To alphapaopao(炮炮):
      我仔细检查过,且跟踪过内存,不是由于内存没释放导致的原因。
    To  silverwgy(yiyi) :
      我已经accept了500多个,没有一个漏的,问题是,在处理完这500个后,已关闭socket资源,用netstat命令查看,正在listening, 但是客户端无法连接。
    这个问题也不是常出现,但我在很多机器上都遇到偶尔有这个问题。
    就是连接数超过一定量后,待这些连接都关了,从原理来讲,socket资源已释放,可以有新的连接了,但这个时候,任何连接都不能连上。
      苦恼啊!找资料找遍了,就是没有最终的解决办法!
      

  4.   

    To  LuYang(爱心) :
    你用什么软件跟踪内存的。能告诉我吗 ?
    谢谢
      

  5.   

    Listen只表明套接字类型,并不表明你是否正在等待接收
    只有服务器accept了连接,connect才会正确返回
    如果长时间没有接收连接,连接队列很快就会堵满,这时客户端就上不来了和time_wait没关系,但服务器最好在客户端关闭连接后再关闭,否则大量的time_wait也不是好事。
      

  6.   

    to niuniuniu() 
      我用memproof.to core(酒载青山) 
      应该不会有长时间没有接收连接的问题。但你说的还是有道理, 怎么把连接队列清空呢?
    难道是循环执行accept, 直到把队列清空?在拒绝服务后没有一个激活的连接,这时accept应该正在等待socket连入呀!
      

  7.   

    sorry, 打错啦!!!!!!!
    对每个连接启动新的服务器进行处理,处理结束后立即关闭这个服务器
      

  8.   

    建议你先看看是不是物理网络或者操作系统的问题,
    在服务端用抓包工具看看客户的SYN包是否能接收到,
    服务端返回了什么包。
      

  9.   

    To  keios(嘿嘿) 
      有什么好的抓包工具、嗅探器吗?
      

  10.   

    感谢大家的热心帮助,尤其感谢silverwgy(yiyi) 和 core(酒载青山) .
    问题确实出在socket连接队列已满, 可能由于并发数多的原因,socket来不及调用accept处理,通过专门的线程来处理accept就解决了该问题了。
    再次感谢!