2014年1月24日星期五

socket编程手记

1.同一socket连着两次connect会发生什么?
  第一次connect成功后,第二次connect会提示 EISCONN,/* Transport endpoint is already connected */,即该socket已经连接上了。

2.客户端connect成功后退出,server端收到什么
  客户端connect成功后退出,发送一个fin到server端,server端调用recv返回空数据
  linux 手册里面的:If no messages are available to be received and the peer has performed an orderly shutdown,recv() shall return 0
    客户端退出后,往server端发送了一个fin:
14:07:10.118038 IP client.49032 > server.30010: F 1:1(0) ack 1 win 64 <nop,nop,timestamp 1558633984 1558633984>
14:07:10.119100 IP server 30010 > client 49032: . ack 2 win 64 <nop,nop,timestamp 1558633985 1558633984>
   这时tcp连接处于半关闭状态.协议栈还是等待server端发出关闭信息。

   server端退出后(或者主动close),tcpdump可以看到server端的确认关闭的信息:
14:21:20.802625 IP server.30010 >client.49032: F 1:1(0) ack 2 win 64 <nop,nop,timestamp 1558846656 1558633984>
14:21:20.802628 IP client.49032 > server.30010: R 1502573033:1502573033(0) win 0

3.listen socket设置成为非阻塞,accept后的connected socket还是非阻塞吗
  int s1 = socket();s1设置成为非阻塞,在s1上面listen,有连接建立后,accept后得到的是一个新的socket(s2),这个socket默认是阻塞的。所以accept后,在s2上面recv数据是阻塞的。

没有评论:

发表评论