当前位置: 技术问答>linux和unix
怎样处理RST响应
来源: 互联网 发布时间:2016-08-31
本文导语: 本帖最后由 afeideweixiao 于 2010-05-31 10:16:00 编辑 各位好, 我知道 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告...
我知道 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。
根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。
我看到网上的处理方式基本是以把 SIGPIPE设为SIG_IGN,但是这个方法是需要发送两次的数据后的处理,前边那个会收到RST响应的数据发送被忽略。而我现在需要的是,只要不能完成数据到服务端的发送,就必须本地保存。所以,我的问题是,怎样知道收到了一个RST的响应?怎样进行RST的处理?
因为如果数据很小,一次能发送完成的情况下,当我在断开服务端后,我发现第一次发送数据的返回值就是需要发送数据的大小,而第二次发送的时候就直接关闭进程。
|
需要忽略SIGPIPE,第二次send的时候会出错,应该在这个时候处理(内核不会发送2次的)
|
send的返回值应该为负吧,判断返回值就行了。
|
楼上的正解,如果发送失败send会返回-1,你判断返回-1就保存本地就可以了。
至于SIGPIPE信号,一般是给它一个空函数,让进程不必因为这样的错误关闭。
至于SIGPIPE信号,一般是给它一个空函数,让进程不必因为这样的错误关闭。