当前位置: 技术问答>linux和unix
请大家帮忙分析下bind出错的原因
来源: 互联网 发布时间:2016-07-05
本文导语: 一个UDP的网络接收应用程序运行时,突然死掉退出!显示如下错误: Backtrace: [] (udp_recvmsg+0x0/0x228) from [] (sock_common_recvmsg+0x4c/0x60) [] (sock_common_recvmsg+0x0/0x60) from [] (sock_recvmsg+0x104/0x130) r5 = C51F39A0 r4 = C15B3DE0...
一个UDP的网络接收应用程序运行时,突然死掉退出!显示如下错误:
Backtrace:
[] (udp_recvmsg+0x0/0x228) from [] (sock_common_recvmsg+0x4c/0x60)
[] (sock_common_recvmsg+0x0/0x60) from [] (sock_recvmsg+0x104/0x130)
r5 = C51F39A0 r4 = C15B3DE0
[] (sock_recvmsg+0x0/0x130) from [] (sys_recvfrom+0x98/0xf0)
r8 = C56F60A0 r7 = C15B3ED4 r6 = 00157240 r5 = 000005DC
r4 = 00000040
[] (sys_recvfrom+0x0/0xf0) from [] (__sys_trace_return+0x0/0x28)
Code: e2880008 e1d330b0 e3a01008 e1c830b2 (e5943020)
如果再一次运行该程序,提示Bind失败。
这时,如果重启机器,则能成功运行,但是运行几十小时后,还是会向上面一样挂掉。
请大家帮忙分析下bind出错的原因!!
Backtrace:
[] (udp_recvmsg+0x0/0x228) from [] (sock_common_recvmsg+0x4c/0x60)
[] (sock_common_recvmsg+0x0/0x60) from [] (sock_recvmsg+0x104/0x130)
r5 = C51F39A0 r4 = C15B3DE0
[] (sock_recvmsg+0x0/0x130) from [] (sys_recvfrom+0x98/0xf0)
r8 = C56F60A0 r7 = C15B3ED4 r6 = 00157240 r5 = 000005DC
r4 = 00000040
[] (sys_recvfrom+0x0/0xf0) from [] (__sys_trace_return+0x0/0x28)
Code: e2880008 e1d330b0 e3a01008 e1c830b2 (e5943020)
如果再一次运行该程序,提示Bind失败。
这时,如果重启机器,则能成功运行,但是运行几十小时后,还是会向上面一样挂掉。
请大家帮忙分析下bind出错的原因!!
|
当客户端保持着与服务器端的连接,这时服务器端断开,再开启服务器时会出现: Address already in usr
可以用netstat -anp | more 可以看到客户端还保持着与服务器的连接(还在使用服务器bind的端口)。这是由于client没有执行close,连接还会等待client的FIN包一段时间。解决方法是使用setsockopt,使得socket可以被重用,是最常用的服务器编程要点。具体的做法为是,在socket调用和bind 调用之间加上一段对socket的设置:
int opt = 1;
setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
可以用netstat -anp | more 可以看到客户端还保持着与服务器的连接(还在使用服务器bind的端口)。这是由于client没有执行close,连接还会等待client的FIN包一段时间。解决方法是使用setsockopt,使得socket可以被重用,是最常用的服务器编程要点。具体的做法为是,在socket调用和bind 调用之间加上一段对socket的设置:
int opt = 1;
setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
|
正解,前两天刚刚学习socket编程,书上就是这么说的。
可以简单的理解为:当服务器端接受(accept)了客户端的请求之后,会创建一个新的socket描述符,此时这个新的socket就独立于原来的socket和客户端进行通讯(read,write操作),而原来的socket继续在帮顶的端口监听(listen)客户端的请求,反复循环着,服务器端的设计原理就是这样的。当服务器端发生了意外而终止了,由于linux内核仍然会将该地址保留一段时间。这是由套接口选项SO_LINGER所控制的。可以按照上面的setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));来设置。