client要绑定一个定值端口(!=0),在一个while循环中不断与server connect/disconnect,现在有一个问题:通常这种情况下第二次连接开始会发生错误WSAEADDRINUSE(10048),那么必须在bind之前进行以下调用:
if(m_dwLocalPort != 0)
{
linger ling;
ling.l_linger = 0;
ling.l_onoff = 1;
if(setsockopt(m_sckAsync, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling)) == SOCKET_ERROR)
return false; }
...
bind(...)这样,当调用colsesocket的时候立刻释放资源,即使立刻又进行第二次connect都不会发生10048错误,但现在新的问题就出现了:
当client调用colsesocket关闭socket的时候server总会收到WSAECONNABORTED(10053)错误,虽然可以不管它,但是觉得很不舒服,烦人啊!如何才能不让server收到这个错误???

解决方案 »

  1.   

    //==========
    client要绑定一个定值端口(!=0),在一个while循环中不断与server connect/disconnect,
    这个地方为什么要不断的connect,disconnect?
    connect对服务器来说可能成本还是有点的。假如是多线程的话,服务器就不停的开线程,结束线程?
      

  2.   

    还有你客户端关闭的时候shutdown了吗?
      

  3.   

    1.我可以在while里等待3秒或者30分钟connect一次,所以必须不断create/connect socket
    2.客户端关闭的时候shutdown则屏蔽了setsockopt(m_sckAsync, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling)这句话,也就是说会发生如此错误:第二次连接开始会发生错误WSAEADDRINUSE(10048)!!
      

  4.   

    I think the method which is used is not proper.
      

  5.   

    1.我可以在while里等待3秒或者30分钟connect一次,所以必须不断create/connect socket
    我的意思是干脆这个socket搞成一个长连接得了。有必要不停的socket,closesocket吗?
    2、shutdown好像不会屏蔽setlinger吧,也许我记错了,shutdown仅仅是发一个包,做个记号,setlinger影响的是closesocket,跟shutdown可能没什么关系吧。
    假如你非要这样做的话,试一试REUSEADDR这个选项吧。