




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux socket 中关闭连接 2010-11-04 17:22:02 分类: C/C+ 关闭 socket 连接,实际上并不是很见到的事情。这涉及到如下的问题,多个进程共享 socket 时如何关闭 socket;关闭通信链路与 socket 描述符的回收。 实际上,关闭 socket 连接,有如下两个函数: close、shutdown。 1、 shutdown(终止 socket 通信) 头文件 #include 定义函 数 int shutdown(int s,int how); 函数说 明 shutdown()用来终止参数 s 所指定的 socket 连线。参数 s 是连 线中的 socket 处理代码,参数 how 有下列几种情况 : how=0 终止读取操作。 how=1 终止传送操作 how=2 终止读取及传送操作 返回值 成功则返回 0,失败返回 -1,错误原因存于 errno。 错误代 码 EBADF 参数 s 不是有效的 socket 处理代码。 ENOTSOCK 参数 s 为一文件描述词,非 socket。 ENOTCONN 参数 s 指定的 socket 并未连线。 另外,一定要注意,在 msdn 上有如下描述: The shutdown function does not close the socket. Any resources attached to the socket will not be freed until closesocket is invoked. 该函数,并不关闭 socket。关联在 socket 上的任何资源都不会被释放,除非调用 closesocket 函 数。 看看,说得很明确了,如果不调用 closesocket 函数,操作系统是不会回收 socket 资源的。 Note The shutdown function does not block regardless of the SO_LINGER setting on the socket. 关于该函数的详细说明,可以参考 msdn:/zh- cn/library/ms740481%28v=VS.85%29.aspx 实际上,要安全的关闭 socket,是需要一些技巧的,在上面给出的 msdn 连接中, 给出了两种建议的方法, 以后可以好好研究一下。 2、closesocket 另一个函数是 closesocket,在 linux 中,就是 close。 使用 close 中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接,只 有当描述符的参考数为 0 时才关闭连接。调用 close 后,将中止通信、删除套接字、 丢弃数据。但是,注意喽,但是,如果有多个进程共享一个套接字,这时出现前述 的情况,close 每被调用一次,计数减 1,直到计数为 0 时,也就是所用进程都调 用了 close,套接字将被释放。 shutdown 可直接关闭描述符,不考虑描述符的参考数,可选择中止一个方向的连 接。 /zh-cn/library/ms737582%28v=VS.85%29.aspx 3、分析 另外在搜搜问问中有如下内容(可能是引自 msdn 中文版): /z/q105118974.htm 从函数调用上来分析(msdn):一旦完成了套接字的连接,应当将套接字关闭,并 且释放其套接字句柄所占用的所有资源。真正释放一个已经打开的套接字句柄的资 源直接调用 closesocket 即可,但要明白 closesocket 的调用可能会带来负面影响, 具体的影响和如何调用有关,最明显的影响是数据丢失,因此一般都要在 closesocket 之前调用 shutdown 来关闭套接字。 shutdown:为了保证通信双方都能够收到应用程序发出的所有数据,一个合格的应 用程序的做法是通知接受双发都不在发送数据!这就是所谓的“正常关闭 ”套接 字的方法,而这个方法就是由 shutdown 函数,传递给它的参数有 SD_RECEIVE,SD_SEND,SD_BOTH 三种,如果是 SD_RECEIVE 就表示不允许再对此套接 字调用接受函数。这对于协议层没有影响,另外对于 tcp 套接字来说,无论数据是 在等候接受还是即将抵达,都要重置连接(注意对于 udp 协议来说,仍然接受并排 列传入的数据,因此 udp 套接字而言 shutdown 毫无意义)。如果选择 SE_SEND,则 表示不允许再调用发送函数。对于 tcp 套接字来说,这意味着会在所有数据发送出 并得到接受端确认后产生一个 FIN 包。如果指定 SD_BOTH,答案不言而喻。 closesocket:对此函数的调用会释放套接字的描述,这个道理众所周知(凡是经常 翻阅 msdn 的程序员),因此,调用此函数后,再是用此套接字就会发生调用失败, 通常返回的错误是 WSAENOTSOCK。此时与被 closesocket 的套接字描述符相关联的 资源都会被释放,包括丢弃传输队列中的数据!对于当前进程中的线程来讲, 所有被关起的操作,或者是被挂起的重叠操作以及与其关联的任何事件,完成例程 或完成端口的执行都将调用失败!另外 SO_LINGER 标志还影响着 closesocket 的 行为,但对于传统的 socket 程序,这里不加解释 因此可以可以看出 shutdown 对切断连接有着合理的完整性。 下面从 tcp 协议上来分析 shutdown 和 closesocket 的行为(behavior): closesocket 或 shutdown(使用 SD_SEND 当作参数时),会向通信对方发出一个 fin 包,而此时套接字的状态会由 ESTABLISHED 变成 FIN_WAIT_1,然后对方发送一个 ACK 包作为回应,套接字又变成 FIN_WAIT_2,如果对方也关闭了连接则对方会发出 FIN,我方会回应一个 ACK 并将套接字置为 TIME_WAIT。因此可以看出 closesocket,shutdown 所进行的 TCP 行为是一样的,所不同的是函数部分, shutdown 会确保 windows 建立的数据传输队列中的数据不被丢失,而 closesocket 会冒然的抛弃所有的数据,因此如果你愿意 closesocket 完全可以取 代 shutdown,然而在数据交互十分复杂的网络协议程序中,最好还是 shutdown 稳 妥一些!?有关 TCP 协议的连接原理清访问 第 RFC793 号文件 4、Linux socket 关闭连接 shutdown 与 close /yelangdefendou/blog/item/8ce7e63618690f355ab5f5b4.ht ml Linux socket 关闭连接 shutdown 与 close转 2010-08-24 18:22 在 Linux socket 关闭连接的方法有两种分别是 shutdown 和 close,首先看一 下 shutdown 的定义 #include int shutdown(int sockfd,int how); how 的方式有三种分别是 SHUT_RD(0):关闭 sockfd 上的读功能,此选项将不允许 sockfd 进行读操作。 SHUT_WR(1):关闭 sockfd 的写功能,此选项将不允许 sockfd 进行写操作。 SHUT_RDWR(2):关闭 sockfd 的读写功能。 成功则返回 0,错误返回-1,错误码 errno:EBADF 表示 sockfd 不是一个有效 描述符;ENOTCONN 表示 sockfd 未连接;ENOTSOCK 表示 sockfd 是一个文件描述符 而不是 socket 描述符。 close 的定义如下: #include int close(int fd); 关闭读写。 成功则返回 0,错误返回-1,错误码 errno:EBADF 表示 fd 不是一个有效描述 符;EINTR 表示 close 函数被信号中断;EIO 表示一个 IO 错误。 下面摘用网上的一段话来说明二者的区别: close-关闭本进程的 socket id,但链接还是开着的,用这个 socket id 的其它进程还能用这个链接,能读或写这个 socket id shutdown-则破坏了 socket 链接,读的时候可能侦探到 EOF 结束符,写的时 候可能会收到一个 SIGPIPE 信号,这个信号可能直到 socket buffer 被填充了才收到,shutdown 还有一个关闭方式的参数,0 不能 再读,1 不能再写,2 读写都不能。 socket 多进程中的 shutdown, close 使用 当所有的数据操作结束以后,你可以调用 close()函数来释放该 socket,从而 停止在该 socket 上的任何数据操作: close(sockfd); 你也可以调用 shutdown()函数来关闭该 socket。该函数允许你只停止在某个 方向上的数据传输,而一个方向上的数据传输继 续进行。如你可以关闭某 socket 的写操作而允许继续在该 socket 上接受数据, 直至读入所有数据。 int shutdown(int sockfd,int how); Sockfd 是需要关闭的 socket 的描述符。参数 how 允许为 shutdown 操作选择 以下几种方式: SHUT_RD:关闭连接的读端。也就是该套接字不再接受数据,任何当前在套接 字接受缓冲区的数据将被丢弃。进程将不能对该 套接字发出任何读操作。对 TCP 套接字该调用之后接受到的任何数据将被确认 然后无声的丢弃掉。 SHUT_WR:关闭连接的写端,进程不能在对此套接字发出写操作 SHUT_RDWR:相当于调用 shutdown 两次:首先是以 SHUT_RD,然后以 SHUT_WR 使用 close 中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接, 只有当描述符的参考数为 0 时才关闭连接。 shutdown 可直接关闭描述符,不考虑描述符的参考数,可选择中止
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装饰维修合同(标准版)
- 购买鱼资料合同(标准版)
- 青年公寓合同(标准版)
- 2025图形设计自考试题及答案
- 食品省代合同(标准版)
- 2025年学历类自考中国古代文学作品选(一)-教育学(一)参考题库含答案解析(5卷)
- 2025年学历类自考中国古代文学作品选(一)-学前儿童保育学参考题库含答案解析(5卷)
- 过继赡养合同(标准版)
- 2025设计美学自考考试题型及答案
- 2025瑞丰银行笔试题库及答案
- 软件著作权无偿转让合同5篇
- 2025年公安警种知识测试题及答案
- 抵押车贷合同(标准版)
- 2025年秋季学期教科版三年级上册科学教学计划(三篇)
- 机械制图(第五版)全套课件
- 人卫慕课《走进肺功能》试题答案
- 议论文如何议论-使素材紧扣中心论点的方法
- 第十二章-地球系统科学课件
- 2022~2023血站上岗证考试题库及答案参考85
- 蒙台梭利的学前教育思想课件
- 公司产品报价单通用格式模板
评论
0/150
提交评论