【发布时间】:2021-12-28 14:04:51
【问题描述】:
练习 C 语言和套接字编程。
服务器代码在检查实时客户端并且客户端已断开连接(例如连接断开)时崩溃。我没有阅读 GDB 转储的经验。有人可以指出我在这里缺少什么吗?
这是服务器代码。客户端连接和断开连接。服务器通过发送一条小消息并等待回复来检查断开连接的客户端。收到损坏的管道错误后,代码崩溃。
void * client_hartbeat()
{
int ret = 0, i;
char send_msg[50] = "e";
char recv_msg[50];
while(1)
{
sleep(3);
printf("\nchecking for disconnected clients\n");
memset(&recv_msg,0,sizeof(recv_msg));
for(i=0;i<CLIENTS;i++){
if(client_pool[i]!=0){
printf("TEST0, socket: %i thread: %i\n", client_pool[i],pthread_self());
if(send(client_pool[i],send_msg,sizeof(send_msg),0) < 0){
printf("send error: %s\n", strerror(errno));
}else if(recv(client_pool[i],recv_msg,sizeof(recv_msg),0) < 0){
printf("receive error: %s\n", strerror(errno));
}
printf("TEST1, socket: %i thread: %d\n", client_pool[i],pthread_self());
}
}
}
printf("TEST1\n");
pthread_exit(&th2);
}
这是 GDB 转储:
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
waiting connections...
[New Thread 0x7ffff7dba640 (LWP 22567)]
[New Thread 0x7ffff75b9640 (LWP 22568)]
checking for disconnected clients
checking for disconnected clients
TEST0, socket: 4 thread: -144992704
TEST1, socket: 4 thread: -144992704
checking for disconnected clients
TEST0, socket: 4 thread: -144992704
TEST1, socket: 4 thread: -144992704
checking for disconnected clients
TEST0, socket: 4 thread: -144992704
Thread 3 "a.out" received signal SIGPIPE, Broken pipe.
[Switching to Thread 0x7ffff75b9640 (LWP 22568)]
__libc_send (flags=<optimized out>, len=50, buf=0x7ffff75b8e10, fd=4) at ../sysdeps/unix/sysv/linux/send.c:28
28 ../sysdeps/unix/sysv/linux/send.c: No such file or directory.
(gdb)
【问题讨论】:
-
您可能应该忽略该信号。
signal(SIGPIPE, SIG_IGN);。无关:你发送sizeof(send_msg)(50字节)即使我怀疑你只发送1字节(e)。 -
我之前确实尝试过 1 个字节,也尝试过 strlen(send_msg) 而不是 sizeof(send_msg) 并且仍然代码崩溃
-
是的,那是一条不相关的评论。您是否尝试忽略信号?如果您尝试在关闭的套接字上使用
send/recv,您还可以在send和recv调用中使用标志MSG_NOSIGNAL以不生成信号。 -
我用我的建议写了一个答案
-
好主意,刚刚尝试使用 MSG_NOSIGNAL 现在服务器代码没有崩溃,从服务器的角度来看,客户端仍然连接,不幸的是,这并不能解决这个问题。服务器应该知道客户端已断开连接。
标签: c multithreading sockets send dump