Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 写入(套接字、buff、长度)导致崩溃_C_Sockets - Fatal编程技术网

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);