c-对于TCP服务器,轮询什么时候能让你知道套接字何时准备好



轮询是在第一个TCP段到达时还是在整个TCP消息到达后给出POLLINrevent?如果是前者,是否可能发送TCP消息的第一段,而不是完整的消息?服务器将如何处理读取,这样它就不会永远阻塞?

编辑:如果我想坚持使用TCP套接字,我已经意识到了问题的解决方案。我可能会尝试SCTP套接字。似乎更符合我想要的工作方式。

TCP是流,而不是消息。因此,轮询可以在接收到任何数量的数据后发生

以下是如何与poll():一起从套接字接收例如1000字节的示例

char buffer[MAX_MSG_SIZE];
char *p = buffer;
size_t bytes_left = 1000;   // Must be less or equal to MAX_MSG_SIZE
for (;;)
{
int ret = poll(fds, num_fds, timeout);
if (ret == -1) {
// Handle poll() errors here
// ...
break;
}
if (ret == 0) {
// Handle timeout here
// ...
continue;
}
if (fds[0].revents & POLLIN)    // Assume socket descriptor is in fds[0].fd
{
ssize_t len = recv(fds[0].fd, p, bytes_left, 0);
if (len == -1) {
// Handle recv() errors here
// ...
}
bytes_left -= len;
p += len;
if (bytes_left == 0) {
// Do something with 1000 bytes in buffer
// ...
// Read next "message", e.g. 500 bytes
bytes_left = 500;
p = buffer;
}
}
// Handle other fds events
// ...
}

最新更新