我的代码精简之后如下:
   SOCKADDR_IN  SockAddr;    // 服务器的监听地址
   CSocket* pSocket;   pSocket = new CSocket();
   pSocket->Create(5161);
   pSocket->Connect((const SOCKADDR*)&SockAddr, sizeof(SOCKADDR_IN));
   ...........
   ...........
   pSocket->Close();
   delete pSocket;   pSocket = new CSocket();
   pSocket->Create(5161);
   pSocket->Connect((const SOCKADDR*)&SockAddr, sizeof(SOCKADDR_IN));第一个Connect调用成功了,问题在于当delete pSocket之后,第二次连接服务器的监听端口时,Connect函数失败,错误代码为WSAEADDRINUSE,可是我已经delete掉了pSocket呀,怎么会出现“地址复用”错误?百思不解,望赐教!如果要求两次Connect使用同一端口连接服务器,那么应该如何修改以上代码?

解决方案 »

  1.   

    我想你应该使用的是none-blocking方式,在这种方式下,调用 close()后socket并未立即完成断开任务,而是要等待一会儿,你应该在FD_CLOSE通知后再进行连接
      

  2.   

    谢谢回答,不过我的CSocket是在“阻塞”模式下的。我想问题应该不在这里。
      

  3.   

    ShutDown(both);
    Close();
    delete pSocket 
    .
    .
    .
    pSocket = new CSocket();
       pSocket->Create(5161);
       pSocket->Connect((const SOCKADDR*)&SockAddr, sizeof(SOCKADDR_IN));
      

  4.   

    你创建的套节字用的是同一个端口5161,除非你是经过2msl时间以后,才可再次使用该端口,网络编程一般客户端socket的端口都是让他动态分配的。
      

  5.   

    不知你为什么要这么做,基于什么目的,你是用udp?
      

  6.   

    那个没用的,在2MSL时间以内网络仍把端口占用,值得2MSL以后才把那个端口释放掉,这跟你在链接上的状态下把网线拔掉一两秒再插上去,结果仍连上的现象一样的道理,网络仍在连通,所以说WSAEADDRINUSE;解决办法你把creat里的端口号去掉,让它动态生成!
      

  7.   

    SOCKADDR_IN  SockAddr;    // 服务器的监听地址
       CSocket* pSocket;   pSocket = new CSocket();
       pSocket->Create();
       pSocket->Connect((const SOCKADDR*)&SockAddr, sizeof(SOCKADDR_IN));
       ...........
       ...........
       pSocket->Close();
       delete pSocket;Sleep( 1000 ) ;   pSocket = new CSocket();
       pSocket->Create();
       pSocket->Connect((const SOCKADDR*)&SockAddr, sizeof(SOCKADDR_IN));
      

  8.   

    谢谢以上各位的恢复,我也已经发现了。在closesocket后是必须经过2msl时间才可以再次绑定该套接字。而使用Shutdown并不能解决这一问题。可以考虑设置SO_REUSEADDR套接字选项。
        谢谢yanhuahui(小辉)。
      

  9.   

    问题已结贴,再次谢谢各位。100分应该属于yanhuahui(小辉)。不过也要特别感谢大家的关注
      

  10.   

    我为什么看不到yanhuahui(小辉)得分,应该怎样给分?
      

  11.   

    请问 yanhuahui(小辉),既然客户端的端口可以随即分配,那是不是说客户端和服务器端建立连接不一定要使用同一端口地址了?也就是建立连接分配同一端口不是必须的?
      

  12.   

    tcp的在WSAAccept可以获得.
    udp的在recvfrom里面可以获得.