TCP:recv()获取ECONNRESET

时间:2016-01-29 20:02:33

标签: c sockets tcp

我正在尝试使用TCP在Linux上实现一个简单的客户端/服务器程序 和标准的socket.h库。服务器处理多个客户端,每个客户端可以随时关闭()或关闭()套接字。

服务器端的

(使用非阻塞读取):

.video

我得到recv()返回-1并将错误设置为ECONNRESET。如果客户端已关闭,则连接不应该recv()返回0?

3 个答案:

答案 0 :(得分:7)

原因很多,包括但不限于:

  • 对等方故意重置连接
  • 对等方关闭连接,而他仍有未读数据等待
  • 您已将数据发送到已由对等方关闭的连接
  • 您有待处理的写入数据且TCP重试已超时
  • TCP keepalive检测到连接丢失。

这是致命错误,你应该在收到套接字时关闭它。

  

每个客户端可以随时close()shutdown()套接字。

不,他不能。见上文。

答案 1 :(得分:4)

如果远程对等方已完全关闭连接,并且本地端没有更多字节等待读取,则是,0应返回ECONNRESET。因此,如果你得到ECONNRESET,那么可以合理地假设有序关闭不是发生的事情。

ECONNRESET通常表示远程对等方发送了RST数据包而没有先干净地关闭连接。造成这种情况的原因有很多。或者,正如EJP观察到的那样,重置也可能来自本地。

无论如何,在recv()之后,假设你能够从套接字中读取任何内容是不合理的,所以在你的特定情况下,你应该处理它与你处理的方式一样0返回<div class="container"> <div class="panel with-nav-tabs panel-default"> <div class="panel-heading"> <ul class="nav nav-tabs"> <li class="active"><a href="#tab1default" data-toggle="tab">Default 1</a></li> <li><a href="#tab2default" data-toggle="tab">Default 2</a></li> </ul> </div> <div class="panel-body"> <div class="tab-content"> <div class="tab-pane fade in active" id="tab1default"> <!--NAV TAB CONTENT SELECTION--> <form name="ServiceSelection"> <input type="radio" id="bankview" name="thing" value="valuable" data-id="bank" checked="checked" /> <label for="bankview">Banks</label> | <input type="radio" id="schoolview" name="thing" value="valuable" data-id="school" /> <label for="schoolview">Schools</label> </form> <!--NAV TAB CONTENT SELECTION--> <hr /> <div id="bank" class="none"> <!--BANK LISTINGS--> <div class="col-lg-12 clearfix"> <div class="col-md-6 col-sm-6 border-red"> Left Bank List <br /> <br /> <br /> </div> <div class="col-md-6 col-sm-6 border-blue"> Right Bank List <br /> <br /> <br /> </div> </div> </div> <div id="school" class="none"> <!--SCHOOL LISTINGS--> <div class="col-lg-12 clearfix"> <div class="col-md-6 col-sm-6 border-red"> Left School List <br /> <br /> <br /> </div> <div class="col-md-6 col-sm-6 border-blue"> Right School List <br /> <br /> <br /> </div> </div> </div> </div> <div class="tab-pane fade" id="tab2default">Default 2 Content</div> </div> </div> </div> </div> ,+ / - 日志。

答案 2 :(得分:3)

如果客户端在没有读取已发送数据的情况下关闭了他的一方,您可能会获得ECONNRESET。如果他正确地关闭了连接,你就会得到0。