我有一个用 C 编写的多线程服务器,每个客户端线程看起来像这样:
ssize_t n;
struct request request;
// Main loop: receive requests from the client and send responses.
while(running && (n = recv(sockfd, &request, sizeof(request), 0)) == sizeof(request)) {
// Process request and send response.
}
if(n == -1)
perror("Error receiving request from client");
else if(n != sizeof(act))
fprintf(stderr, "Error receiving request from client: Incomplete data\n");
// Clean-up code.
在某些时候,客户端满足必须断开连接的特定标准。如果客户端定期发送请求,这很好,因为它可以在响应中被告知断开连接;然而,有时客户端需要很长时间才能发送请求,因此客户端线程最终会在recv
调用中阻塞,并且客户端直到下一个请求/响应才会断开连接。
当客户端线程在调用中阻塞时,是否有一种干净的方法可以将客户端与另一个线程断开连接recv
?我试过close(sockfd)
了,但这会导致错误Error receiving request from client: Bad file descriptor
发生,这确实不准确。
或者,有没有更好的方法让我在这里处理错误?