用winAPI写的,服务器、客户端全部采用异步选择模式 客户端想用固定端口连接服务器,客户端套接字创建后设置SO_ReuseAddr为true,然后bind,connect 客户端主动断开连接后,服务器接收到消息,同时把服务器的套接字也关闭 但客户端再次连接时仍然报10048错误,地址已使用 客户端断开连接后,的确套接字处于time_wait状态,但使用SO_ReuseAddr后,并不像资料上说明的可以再连接嘛 
注明:  
  客户端、服务器运行在同一机器上,采用127。0。0。1 
  服务端如果设置SO_ReuseAddr后,断开监听套接字,再在同一地址上连接到是可以 
这个问题搞了两天还是不行,求高手解答 

解决方案 »

  1.   

    SO_REUSEADDR,只能是重用端口,但是并不能违反TCP协议当中以LocalIP+LocalPort+RemoteIP+RemotePort唯一区分会话的原则.对于TIME_WAIT状态可以通过设置参数SO_LINGER时间为0来消除,但是不推荐此种做法,特别是对于TCP/IP协议工作原理不太了解的,背后隐藏的问题是不可忽视的.
      

  2.   

    我现在又发现一个问题,如果是服务器端主动断开连接(不是监听套接字),则服务器端再连接时是可以的,此时查看netstat,发现服务器端套接字处于time_wati状态,而客户端套接字已关闭(查不到状态),这又如何解释?另外回楼上,按照书本上说,SO_Linger可以设置拖延时间,即ONOff设置为1,Linger设置为非0,但实际情况并不是拖延指定时间,网上资料说TIME_WAIT的拖延时间是2*MSL时间,win平台上是4分钟,我测试结果基本也证实是这样。
    那SO_Linger的这个linger属性值又是什么意思,难道只能设置是否拖延,不能指定拖延时间?
      

  3.   

    那如果有这样的需求:
       客户端每隔一段时间(小于time_wati的拖延时间,4分钟)向服务器发送一次数据,然后主动断开,如果是自动选择端口,那一段时间后端口用完会报错,必须使用固定端口号,怎么实现呢?
      

  4.   

    顶一下,我也遇到同样的问题,客户端在与服务器端建立连接后,就不能再监听,等待其它客户端的连接
    我也用了 setsockopt 来指定端口可重用但是总是返回错误
      

  5.   

    其实不管是哪一方处于TIME_WAIT状态,只要是通过netstat查看到存在的四个配对条件与新连接会产生冲突都无法连接上.
      

  6.   

    你在服务器端将 socket 设为地址可重用,试一下,应该可以的
      

  7.   

    设置服务器端不行
    如果什么都不设置,由服务器端主动断开连接,则客户端重连能够成功
    所以SO_ReuseAddr只能用以解决TIme_Wait状态下问题,但由不能破坏5个因素达成的唯一性,实在搞不懂该怎么用
      

  8.   

    如果是这样,那资料上所描述的在Time_wait状态下使用SO_ReuseAddr达到地址复用,也只有在客户端断开与服务器1的连接后,在不需要等待4分钟后就可以连接服务器2的应用场景下使用了再等等看有没有其他解释