【发布时间】:2023-03-08 17:23:01
【问题描述】:
我有一个服务器,它为每个客户端创建一个线程。这是线程函数,我的程序在其中等待发送数据。如果 5 秒内没有数据发送,我需要以某种方式关闭此线程。我尝试使用该信号/警报组合,并且以某种方式工作,但是线程函数的其余部分正在继续打印错误,因为 sClient(socket) 已关闭。我怎样才能使这项工作,或者其他解决方案?
void time_out() {
char r = "-1";
printf("Time out");
send(sClient, &r, 10, 0);
close(sClient);
}
void* thread(void *arg) {
sClient = (int)arg;
int size;
char* buffer = (char*)malloc(300);
signal(SIGALRM, time_out);
alarm(5);
if (recv(sClient, (char*)&size, sizeof(int), 0) < 0) {
printf("Error when getting length \n");
}
....
}
【问题讨论】:
-
不确定你到底要做什么,但听起来你想为客户端打开一个线程,等待5秒,如果客户端没有发送数据则关闭它那时。对吗?
-
是的 :)。我该怎么做?
-
您有什么理由决定使用 SIGALRM 方法吗?为什么不在你的线程中只
sleep(5)在进行接收呼叫之前?是不是因为 recv 阻塞了? -
我会使用
select超时 5 秒,如果select指示套接字上有数据等待,则仅尝试recv。 -
也可以只关闭主线程中的套接字。这将结束阻塞 recv 将返回 WSAEINTR。这样,无响应客户端的线程将终止。
标签: c++ c multithreading recv