C 写入(套接字、buff、长度)导致崩溃
我有一个程序,可以将数据发送到安卓手机。让我们开始吧 //编辑C 写入(套接字、buff、长度)导致崩溃,c,sockets,C,Sockets,我有一个程序,可以将数据发送到安卓手机。让我们开始吧 //编辑 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
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; }
}
while(enviado0)enviado+=r;
else如果(r==0){printf(“*>>socketcerrado[datos](%d)\n”,r);返回r;}
如果(r==-1){printf(“*>>错误[datos](%d)\n”,r),则返回r;}
}
当我离开这段时间后,我会更改buff\u enviar
值。当我通过成功执行socket.close()来取消手机中的传输时,write
会让我的程序无缘无故地结束。所以我的程序的输出是:
发送
好啊
发送
好啊
发送
我猜这是write
错误,因为它没有打印OK。ERRNO值为61(无可用数据)
我希望以前有人遇到过这个问题并解决了它
编辑:有时当我取消时,r=-1,这样我可以处理错误,但大多数时候它只是终止程序。就像是随机选择的。我很困惑:(
亲切问候,,
劳尔您正在向一个关闭的套接字写入数据,默认情况下,该套接字会生成一个“断管”信号(
SIGPIPE
)。为了能够可靠地从write()
恢复,您需要调用以下命令来忽略EPIPE
:
signal (SIGPIPE, SIG_IGN);
在程序中的某个地方,例如在
main()
中,虽然选择的答案是忽略整个信号处理,但还有其他选择:
将send
功能与MSG\u NOSIGNAL
一起使用:
send(con, buff_enviar+enviado, length-enviado, MSG_NOSIGNAL);
在套接字级别禁用SIGPIPE(并非在所有内核上都可用):
为调用线程禁用SIGPIPE:
sigset_t set;
sigemptyset (&set);
sigaddset (&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
最后,禁用信号处理范围(不建议用于库):
您正在向正在关闭的套接字写入数据吗?听起来您就是这么说的。请记住检查write()的返回值@user1927490,检查成功写入了多少字节。是的,看起来应该是r=write…抱歉,是的。只是我一直在做测试,在这里写入时忘了再次添加。已更改,但仍然无法工作。正如我所说,我想问题在于写入(),因为它不是printf OK。SEND和OK在两个单独的printf中,因为我想知道程序何时终止。调试的东西
sigset_t set;
sigemptyset (&set);
sigaddset (&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
signal(SIGPIPE, SIG_IGN);