欢迎来到天天文库
浏览记录
ID:34707917
大小:53.95 KB
页数:4页
时间:2019-03-09
《linuxsocket中关闭连接》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、linuxsocket中关闭连接2010-11-0417:22:02分类:C/C++关闭socket连接,实际上并不是很见到的事情。这涉及到如下的问题,多个进程共享socket时如何关闭socket;关闭通信链路与socket描述符的回收。实际上,关闭socket连接,有如下两个函数:close、shutdown。1、shutdown(终止socket通信)头文件#include定义函数intshutdown(ints,inthow);函数说明shutdown()用来终止参数s所指定的socke
2、t连线。参数s是连线中的socket处理代码,参数how有下列几种情况:how=0终止读取操作。how=1终止传送操作how=2终止读取及传送操作返回值成功则返回0,失败返回-1,错误原因存于errno。错误代码EBADF参数s不是有效的socket处理代码。ENOTSOCK参数s为一文件描述词,非socket。ENOTCONN参数s指定的socket并未连线。另外,一定要注意,在msdn上有如下描述:Theshutdownfunctiondoesnotclosethesocket.Anyresourcesattached
3、tothesocketwillnotbefreeduntilclosesocketisinvoked.该函数,并不关闭socket。关联在socket上的任何资源都不会被释放,除非调用closesocket函数。看看,说得很明确了,如果不调用closesocket函数,操作系统是不会回收socket资源的。NoteTheshutdownfunctiondoesnotblockregardlessoftheSO_LINGERsettingonthesocket.关于该函数的详细说明,可以参考msdn:http://msdn.
4、microsoft.com/zh-cn/library/ms740481%28v=VS.85%29.aspx实际上,要安全的关闭socket,是需要一些技巧的,在上面给出的msdn连接中,给出了两种建议的方法,以后可以好好研究一下。2、closesocket另一个函数是closesocket,在linux中,就是close。使用close中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接,只有当描述符的参考数为0时才关闭连接。调用close后,将中止通信、删除套接字、丢弃数据。但是,注意喽,但是,如果有多个进程共享
5、一个套接字,这时出现前述的情况,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放。shutdown可直接关闭描述符,不考虑描述符的参考数,可选择中止一个方向的连接。http://msdn.microsoft.com/zh-cn/library/ms737582%28v=VS.85%29.aspx3、分析另外在搜搜问问中有如下内容(可能是引自msdn中文版):http://wenwen.soso.com/z/q105118974.htm从函数调用上来分析(msdn):一旦完成
6、了套接字的连接,应当将套接字关闭,并且释放其套接字句柄所占用的所有资源。真正释放一个已经打开的套接字句柄的资源直接调用closesocket即可,但要明白closesocket的调用可能会带来负面影响,具体的影响和如何调用有关,最明显的影响是数据丢失,因此一般都要在closesocket之前调用shutdown来关闭套接字。shutdown:为了保证通信双方都能够收到应用程序发出的所有数据,一个合格的应用程序的做法是通知接受双发都不在发送数据!这就是所谓的“正常关闭”套接字的方法,而这个方法就是由shutdown函数,传递
7、给它的参数有SD_RECEIVE,SD_SEND,SD_BOTH三种,如果是SD_RECEIVE就表示不允许再对此套接字调用接受函数。这对于协议层没有影响,另外对于tcp套接字来说,无论数据是在等候接受还是即将抵达,都要重置连接(注意对于udp协议来说,仍然接受并排列传入的数据,因此udp套接字而言shutdown毫无意义)。如果选择SE_SEND,则表示不允许再调用发送函数。对于tcp套接字来说,这意味着会在所有数据发送出并得到接受端确认后产生一个FIN包。如果指定SD_BOTH,答案不言而喻。closesocket:对
8、此函数的调用会释放套接字的描述,这个道理众所周知(凡是经常翻阅msdn的程序员),因此,调用此函数后,再是用此套接字就会发生调用失败,通常返回的错误是WSAENOTSOCK。此时与被closesocket的套接字描述符相关联的资源都会被释放,包括丢弃传输队列中的数据!!!!对于当前进程中的线程来讲,所有
此文档下载收益归作者所有