写入(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,所以我可以处理错误,但大多数时候它只是终止程序。这就像随机选择。我很困惑:(

亲切的问候, 劳尔

+0

你写到正在关闭套接字?这就是你想说的。 – tay10r 2013-04-20 19:01:36

+1

记得检查write()@ user1927490的返回值,以检查成功写入的字节数。 – 2013-04-20 19:02:18

+1

是的,它看起来应该是r =写... – tay10r 2013-04-20 19:02:46

您写这封信是一个封闭的插座,默认情况下生成一个“破管道”信号(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);