linux命令关闭套接字fd,linux socket中关闭连接

在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>.

如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套

接字将被释放。

2>. 在多进程中如果一个进程中shutdown(sfd,

SHUT_RDWR)后其它的进程将无法进行通信. 如果一个进程close(sfd)将不会

影响到其它进程. 得自己理解引用计数的用法了. 有Kernel编程知识的更好理解了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
套接字(Socket)是一种通信机制,它允许不同的进程在同一主机或不同主机之间进行通信。Linux下的套接字编程可以使用C语言的套接字接口库函数来实现。 以下是一个简单的Linux套接字编程教程: 1. 创建套接字 使用socket()函数创建一个套接字socket()函数的原型如下: ```c int socket(int domain, int type, int protocol); ``` 其,domain指定协议族,type指定套接字类型,protocol指定协议。常用的协议族有AF_INET(IPv4)和AF_INET6(IPv6),套接字类型有SOCK_STREAM(TCP)和SOCK_DGRAM(UDP),协议有IPPROTO_TCP和IPPROTO_UDP等。 例如,创建一个TCP协议的套接字: ```c int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ``` 2. 绑定地址 使用bind()函数将套接字与一个地址绑定。bind()函数的原型如下: ```c int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); ``` 其,sockfd是要绑定的套接字描述符,addr是一个指向地址结构体的指针,addrlen是地址结构体的长度。 例如,绑定到本地IP地址和指定端口号: ```c struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(8080); int ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); ``` 3. 监听连接 使用listen()函数将套接字设置为监听状态。listen()函数的原型如下: ```c int listen(int sockfd, int backlog); ``` 其,sockfd是要监听的套接字描述符,backlog是在内核排队等待的连接的最大数量。 例如,设置最大排队数量为5: ```c int ret = listen(sockfd, 5); ``` 4. 接受连接 使用accept()函数接受客户端连接请求,并创建一个新的套接字用于与客户端进行通信。accept()函数的原型如下: ```c int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); ``` 其,sockfd是监听套接字描述符,addr是一个指向地址结构体的指针,用于存储客户端的地址信息,addrlen是地址结构体的长度。 例如,接受客户端连接请求,并创建一个新的套接字描述符: ```c struct sockaddr_in client_addr; socklen_t client_addrlen = sizeof(client_addr); int newfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addrlen); ``` 5. 发送和接收数据 使用send()函数向对端发送数据,使用recv()函数从对端接收数据。send()和recv()函数的原型如下: ```c ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); ``` 其,sockfd是要发送或接收数据的套接字描述符,buf是要发送或接收的缓冲区,len是缓冲区的长度,flags是可选的标志参数。 例如,发送数据: ```c char msg[] = "Hello World!"; int ret = send(newfd, msg, sizeof(msg), 0); ``` 例如,接收数据: ```c char buf[1024]; int ret = recv(newfd, buf, sizeof(buf), 0); ``` 6. 关闭套接字 使用close()函数关闭套接字。close()函数的原型如下: ```c int close(int fd); ``` 其fd是要关闭套接字描述符。 例如,关闭套接字: ```c close(sockfd); ``` 以上是一个简单的Linux套接字编程教程。套接字编程涉及到许多细节和复杂的操作,需要仔细学习和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值