C 关闭socket

C关闭socket有两种方法:

一、shutdown

#include<sys/socket.h>

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<unistd.h>

int close(int fd);

关闭读写。

成功则返回0,错误返回-1,错误码errno:EBADF表示fd不是一个有效描述符;EINTR表示close函数被信号中断;EIO表示一个IO错误。

注意:

1、shutdown 可以单向关闭,Close不可以.

2、当多线程共享/调用同一个Socket时,Close只是会减1,直到减到0才会真正去关闭Socket,而shutdown则不会理会有多少线程在用,直接关闭socket.

C 关闭socket

时间: 2024-08-29 10:21:41

C 关闭socket的相关文章

解决关闭socket之前,提交socket发送缓冲内容的问题

经过长时间的调整,测试,今天终于解决了web服务器关闭socket时,缓冲中未发送的内容被抛弃的问题. 公司让我开发一个小的服务器支撑系统,我使用C++编写了一个小的httpd服务器,以便能够打造自己的服务器,扩充自己想要的各种功能(如各种统计功能.扩展接口功能).在开始的简单网页测试时,没有发现问题:但是,在系统部署上线后,偶尔出现IE界面长时间转圈圈,就是不显示页面的内容.有时通过点击刷新几次,系统又正常.因为这个系统比较小,使用也不是很频繁,所以系统将就着使用. 过了一段时间,乘着系统升级

close与shutdown关闭socket连接的区别

close: int close(int fd) 并非马上关闭fd对应的socket连接,而是对其文件描述符的引用计数减1, 只有当fd的引用计数为0时,才关闭连接,对应fork复制的socket描述符, 无论时父进程还是子进程都需要调用close才能正确关闭连接. shutdown: int shutdown(int fd, int howto) 专为针对网络编程设计,一旦调用便终止socket连接, howto参数: 1.SHUT_RDWR (read & write) 同时关闭socket

关闭socket以及Socket选项

1 关闭socket ·1)socket套接字使用完毕之后,我们需要将起及时的关闭,正如输入输出流的关闭是一样的:在我上一篇文章中介绍了如何模拟httpClient发送请求数据:这里我还是使用上一篇文章中的代码做一个socket的关闭操作:我们一般是将socket放在finally{}代码块中去执行的,因为这部分总归是要执行的. public void communicate() throws Exception { try{ StringBuffer sb = new StringBuffer

如何才能正确的关闭Socket连接

从TCP协议角度来看,一个已建立的TCP连接有两种关闭方式,一种是正常关闭,即四次挥手关闭连接:还有一种则是异常关闭,我们通常称之为连接重置(RESET).首先说一下正常关闭时四次挥手的状态变迁,关闭连接的主动方状态变迁是FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT,而关闭连接的被动方的状态变迁是CLOSE_WAIT->LAST_ACK->TIME_WAIT.在四次挥手过程中ACK包都是协议栈自动完成的,而FIN包则必须由应用层通过closesocket或sh

python close()是假象,真正关闭Socket的方法

背景: 工作中自己用python写了一个tcp工具,然后用while循环一直接收消息,并且打印出来.然后正常close发现设备并没有离线,然后用了临时的规避方案,发现其实是一直阻塞在recv()接收方法里面,只要传输一条协议,让recv()吃到消息即可正常运行while来让其break退出,但是这种规避方式是临时的,治病要治其根,所以对现在socket进行了研究. 问题原因: 虽然已经将连接close掉了,但是client端仍然可以顺利的接收到消息,而且,如果client端发送数据的间隔小于超时

java socket - 半关闭

通常,使用关闭输出流来表示输出已经结束.但在进行网络通信时则不能这样做.因为我们关闭输出流时,该输出流对应的Socket也将随之关闭,这样程序将无法再从该socket中读取数据. 为了应付这种情况,socket提供了两个半关闭的方法用来只关闭socket的输入流或者输出流,用以表示输出数据已经发送完成.方法详情: shutdownInput():关闭该socket的输入流,程序还可以通过该socket的输出流输出数据: shutdownOutput():关闭该socket的输出流,程序还可以通过

socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调

高性能 TCP Socket连接关闭释放集中调度类

/// <summary> /// Socket关闭调度类,此类提供了静态访问,但是此类可以实例化 /// </summary> /// <remarks> /// Socket连接关闭类 /// 3个队列 /// 1.shotdown 关闭队列 /// 步骤1 /// 2.close 队列 间隔2秒 /// 步骤2 /// 3.dispose 队列 间隔1秒 /// 步骤3 /// </remarks> public class CloseSoketDis

[转]socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调