网络编程--closesocket(s)与shutdown(s,type)的区别

来源:互联网 发布:p2p网络摄像机软件 编辑:程序博客网 时间:2024/05/15 12:28

转载自:http://blog.csdn.net/witchsnk/article/details/3075614


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


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

如果一个套接字在使用完之后没有CloseSocket,那么端口等资源没有断开,当再利用此端口bind套接字时,bind函数就会出错

原创粉丝点击