我正在尝试使用TCP在Linux上实现一个简单的客户端/服务器程序 和标准的socket.h库。服务器处理多个客户端,每个客户端可以随时关闭()或关闭()套接字。
服务器端的(使用非阻塞读取):
.video
我得到recv()返回-1并将错误设置为ECONNRESET。如果客户端已关闭,则连接不应该recv()返回0?
答案 0 :(得分:7)
原因很多,包括但不限于:
这是致命错误,你应该在收到套接字时关闭它。
每个客户端可以随时
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。