一个客户端与服务器建立了TCP连接,在客户端关闭连接时,Close() 和 shutdown()两者是否有区别?? 有怎样的区别??? 

解决方案 »

  1.   

    shutdown
    The shutdown function disables sends or receives on a socket.
    这个是windows的api
    close是标准库的api,适用于其他io操作
      

  2.   

    shutdown可以分别关闭读写或者同时关闭读写   
      如果关闭读,则接受缓冲区的未读出的所有数据都将丢失,以后不会再接受任何数据   
      如果关闭写,如果输出缓冲区内有数据,则所有的数据将发送出去后将发送一个FIN信号   
        
      而close则是关闭该socket,马上发送FIN信号,所有的未完成发送或者接受的数据都将被丢失   
        
      对于慢速网络,应该先进行shutdown,然后一定的时间延迟,再close该socket
      

  3.   

    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()   之後才会释放。