服务端closesocket(s),客户端会自动收到关闭连接的消息,而shutdown则不会!
最近要做个套接字连接池,为了不释放资源,即不调用closesocket,而调用shutdown,
但如何通过调shutdown来通知客户端关闭连接???

解决方案 »

  1.   

    TCP有半关闭的情况,如果要全关闭,需要双方向对端发送Fin报文,然后对对方的Find报文进行响应(Ack)
      shutdown表示不再发送数据,但是并没有发送Fin报文,没有终止连接,实际上TCP连接仍然存在,这时如果你要重新建立该Socket对(源/目的端口,源/目的IP均相同)的话是会失败的,因为连接还存在,你就不能重复创建
      如果closesocket后表明连接已经彻底终止了,可以重新用connect/accept建立连接。
      

  2.   

    shutdown可以根据参数决定停止接收或停止发送关闭一个socket前,通常先shutdown接收,然后recv数据直到缓冲区没有数据,然后close,成为优雅关闭
      

  3.   

    kingzai(stevenzhu) 解释的很详细了。
    shutdown表示不再接收和发送数据。
    closesocket后表明连接已经彻底终止了。发送一个数据包通知客户端,让客户端自己调用closesocket关闭连接。
      

  4.   

    发送一个终止指令然后让客户端关闭是最好的方式, 这样近可能不会因为服务器匆忙地关闭连接而导致数据发送不完整.  调用 shutdown,称为套接字的从容关闭. 其实不是真正关闭,最后还需要调用close 来释放这个连接的.
      

  5.   

    shutdown可以根据参数决定停止接收或停止发送关闭一个socket前,通常先shutdown接收,然后recv数据直到缓冲区没有数据,然后close,成为优雅关闭
    ------------------------------应该是先shutdown发送吧,然后再recv数据直到缓冲区没有数据,然后close,成为优雅关闭
      

  6.   

    closesocket函数用来关闭一个描述符为s套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。
    closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR。shutdown():停止 Socket 接收/传送的功能。 
    格式: int PASCAL FAR shutdown( SOCKET s, int how ); 
    参数: s Socket 的识别码,how 代表该停止那些动作的标帜 
    传回值: 成功 - 0 
    失败 - SOCKET_ERROR (呼叫 WSAGetLastError()可得知原因) 
    说明: 此函式用来停止 Socket 的後续接收或传送的功能。 
    若 how 的值为 0,则不再接收资料。 
    若 how 的值为 1,则不再允许传送资料。 
    若 how 的值为 2,则不再接收且不再传送资料。 
    shutdown() 函式并没有将 Socket 关闭,所以该 Socket 所占用之资源必须在呼叫closesocket() 之後才会释放。 
      

  7.   

    异步方式中OnReceive响应中Receive函数返回零则客户端主动关闭
      

  8.   

    ffantasyYD(风之子) 这样不行的,aiyue2010(亚伦) 说得很清楚了,我现在的问题就是,服务端
    shutdown(),后,客户端如何判断连接是否有效??
      

  9.   

    shutdown后连接依然有效,对方的OnClose不会响应