服务端已经close为什么客户端的write/read方法都不返回错误呢?

新手上路,请多包涵

clipboard.png

我在同一台机器上做实验,分别运行服务端和客户端,服务端accept后,fork()一个子进程处理,子进程第一次read后阻塞接着客户端第一次write,子进程read返回接着close掉socket,并且调用exit(0)退出。由于子进程消失,但端口资源未被释放,该端口为FIN_WAIT_2的状态。

接着客户端第二次调用write函数,按照常理来讲此时的write会导致服务器响应一个RST给我,但是write返回4096,并不是一个-1,而且我又调用read函数也是一个0,也没有-1,这是怎么一回事?求解

阅读 4.5k
2 个回答

你主进程accept以后,主进程要把sockfd关闭啊。否则引用计数还维持着。以后子进程即使关闭了。也无法释放套接字的。
另外TCP结束需要双向关闭。就算服务器close的话,client的read方向并没有关闭。client还是可以read的。

@bokutake 说的对,但是server不应该主动关闭连接,这样会堆叠过多TIME_WAIT状态的连接,还有就是现在做Server都不用fork去处理而是用threadpool,刚好我写了一个server库,感兴趣可以看一下Charles Server

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进