socket的shutdown和close

1. 自己写的socket的shutdown和close相关测试

编号测试手段测试结果附加测试附加测试结果
1shutdown(fd, 0)【不能再读】write成功,shutdown之后netstat显示C和S的状态均为established(没有发送FIN).close后再writeclose后netstat显示server的socket为FIN_WAIT_2,write执行后返回-1,errno=9[EBADF]
recv返回0,netstat同上  
2shutdown(fd,1)【不能再写】write执行该语句时,server向client发送了FIN,所以netstat显示server为FIN_WAIT_2,缓冲区为空;client为CLOSE_WAIT,接收缓冲区有1B。
执行write时受到信号SIGPIPE,服务器端程序退出。
客户端一直处于CLOSE_WAIT状态
  
recv执行该语句时,server向client发送了FIN,所以netstat显示server为FIN_WAIT_2,缓冲区为空;client为CLOSE_WAIT,接收缓冲区有1B。
过了5分钟server一直处于FIN_WAIT_2状态,recv一直阻塞【如果有数据来,在接收缓冲区,那么recv成功】
  
3shutdown(fd, SHUT_RDWR)【不能读写】write收到SIGPIPE信号,程序退出,netstat显示server处于FIN_WAIT_2状态,2个buffer为空,通过tcpdump抓包可以看到server向client发送了一个FIN,并且client回复了ACK;而client端为CLOSE_WAIT状态,接收缓存区有1B,发送缓冲区为空。因为一直在pause()等待信号的到来  
recv返回0,netstat同上  
4shutdown(fd, 0)+closewriteclose发送reset过去,server和client的socket均变为closed状态。
Write返回-1,errno=9
  
recv同上  
5shutdown(fd,1)+closewrite返回-1,errno=9;
执行shutdown时,发送FIN,执行close时发送RST.netstat显示两端均为closed状态。再执行write/recv必然errno=9
  
recv同上  
6shutdown(fd, SHUT_RDWR)+closewrite同上  
recv同上  
7多次相同的shutdown(fd, n) 只有第一次的有效,后面的无效  
8shutdown(fd,0)shutdown(fd,1)第一次shutdown没有发送FIN,第二次发送FIN,到状态FIN_WAIT_2.  
shutdown(fd,2)  
9closewriteclose发送reset过去,server和client的socket均变为closed状态。
本进程的Write返回-1,errno=9
其他进程可以继续write/recv,参见bwserver中fork那段程序
  
recv同上  

 

2.文字补充说明:

close使用close中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接,只有当描述符的参考数为0时才关闭连接。
如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放
shutdownshutdown可直接关闭描述符,不考虑描述符的参考数,可选择中止一个方向的连接
在多进程中如果一个进程中shutdown(sfd, SHUT_RDWR)后其它的进程将无法进行通信. 如果一个进程close(sfd)将不会影响到其它进程.

### 回答1: 在Socket编程中,shutdown()和close()都是用来关闭一个套接字(Socket)的方法,但二者有不同的作用。 shutdown()方法是用来关闭一个已连接的套接字,它可以在客户端和服务器端分别调用。shutdown()的调用会使得套接字不能再进行数据的发送和接收,但它可以继续进行一些管理操作,例如可以发送一些控制信息给对方,告知对方套接字已关闭。 而close()方法是用来关闭一个套接字的连接,它可以在客户端和服务器端分别调用。调用close()方法后,套接字不再使用,也不会再接收或发送数据。当客户端调用close()时,它会向服务器发送一个关闭连接的请求,服务器收到请求后也会调用close()方法关闭套接字。 ### 回答2: 在Socket编程中,shutdownclose都是用于关闭连接的方法,但它们有一些区别。 首先,shutdown是用于半关闭连接的操作,它可以关闭Socket的输入和输出流的其中一方。shutdown方法可以接受一个参数,该参数可以是常量Socket.SHUT_RD,用于关闭输入流;也可以是常量Socket.SHUT_WR,用于关闭输出流;还可以是常量Socket.SHUT_RDWR,用于关闭输入和输出流。通过这种方式,可以控制关闭连接的一方。 相比之下,close是用于完全关闭连接的操作,它会关闭Socket的输入和输出流,并释放相关的资源。调用close方法后,再次尝试使用该Socket将会抛出异常。 其次,shutdown可以在一个Socket处于连接状态时多次调用,并且可以对输入和输出流进行独立的关闭,而close方法只能在一个Socket连接被完全关闭后调用一次。 最后,通过调用shutdown方法关闭连接,可以保留Socket状态信息和相关资源,并继续使用该Socket进行数据传输。而调用close方法关闭连接则会释放Socket相关的资源,并且无法再次使用该Socket。 综上所述,shutdownclose方法在Socket编程中都可以用于关闭连接,但shutdown方法可以控制关闭连接的一方,可以多次调用并保留Socket状态,而close方法只能完全关闭连接并释放相关资源。 ### 回答3: 在Socket编程中,shutdown()和close()是两个不同的方法,用于关闭连接和释放Socket资源。 shutdown()方法用于关闭已连接的Socket连接,它需要传入一个参数,来指定关闭的方式。参数可以是SHUT_RD、SHUT_WR或SHUT_RDWR。SHUT_RD表示禁止读取数据,SHUT_WR表示禁止写入数据,SHUT_RDWR表示同时禁止读写数据。通过调用shutdown()方法,我们可以选择关闭连接的读端、写端或者同时关闭两者,这样就可以保持双方的连接而不再传输数据。 相比之下,close()方法是用于完全关闭Socket连接,它不需要传入任何参数。调用close()方法会立即关闭Socket连接,并释放所有与该Socket相关的资源。关闭连接后,将无法再进行读取或写入操作,也无法再建立连接。 总结来说,shutdown()方法是暂时关闭Socket连接的一种手段,可以选择性地关闭读端、写端或者两者。而close()方法是永久关闭Socket连接,并释放相关资源的一种方式。关闭连接后,将无法再进行数据传输或者建立新的连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值