写入(socket,buff,length)会导致崩溃
问题描述:
我有一个程序可以通过android向手机发送数据。让我们iamgine写入(socket,buff,length)会导致崩溃
//编辑
while(enviado < length) {
printf("SEND\n");
r = write(con, buff_enviar+enviado, length-enviado);
printf(" OK\n");
if (r > 0) enviado += r;
else if (r == 0) { printf(" * >> Socket cerrado [datos] (%d)\n",r); return r; }
else if (r == -1) { printf(" * >> Error [datos] (%d)\n",r); return r; }
}
当我离开这个同时,我改变buff_enviar
值。当我取消手机中的传输时,通过执行一个成功的socket.close(),write
使我的程序无故结束。所以,我的程序的输出是:
SEND OK SEND OK SEND
我想这是write
错,因为它不printf的确定。 ERRNO值为61(无可用数据)
我希望有人遇到过这个问题并解决了它。
编辑:有时当我取消,r = -1,所以我可以处理错误,但大多数时候它只是终止程序。这就像随机选择。我很困惑:(
亲切的问候, 劳尔
答
您写这封信是一个封闭的插座,默认情况下生成一个“破管道”信号(SIGPIPE
)。为了能够可靠地write()
恢复,你需要通过调用忽略EPIPE
:
signal (SIGPIPE, SIG_IGN);
在你的程序
的地方,例如在main()
+0
它只是工作。太棒了!非常感谢! – McD0n3ld 2013-04-20 19:18:44
答
虽然选择的答案是忽略信号PROC ESS宽,有其他选择:
使用send
功能与MSG_NOSIGNAL
:
send(con, buff_enviar+enviado, length-enviado, MSG_NOSIGNAL);
套接字级别的禁用SIGPIPE
(并非适用于所有的内核):
int flag = 1;
setsockopt(con, SOL_SOCKET, SO_NOSIGPIPE, &flag, sizeof(flag));
禁用SIGPIPE
支持来电线程:
sigset_t set;
sigemptyset (&set);
sigaddset (&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
最后,中断信号处理范围(不推荐库):
signal(SIGPIPE, SIG_IGN);
你写到正在关闭套接字?这就是你想说的。 – tay10r 2013-04-20 19:01:36
记得检查write()@ user1927490的返回值,以检查成功写入的字节数。 – 2013-04-20 19:02:18
是的,它看起来应该是r =写... – tay10r 2013-04-20 19:02:46