我目前正在用 C 语言编写一个服务器,该服务器使用 TCP 通过套接字进行通信。客户端应该发送 {filename\n} + {file contents\n},服务器将存储该信息,然后发送成功响应。但是,我们不能确定客户端实际上会在结构化协议中发送正确的信息。
通常在更简单的情况下,我们知道之前要发送的指定字节数,并且可以等到达到指定的字节数。在这种情况下,我们不这样做,目前代码如下所示:
//buffer is a resize-able array,
//assume it's correct + don't worry about memory leakage for now
resizeablearray_t *buffer;
char data[255];
char retry = 1;
while (retry) {
int bytes = read(socketfd, data, 255);
if (bytes <= 0) {
fprintf(stderr, "Error %s\n", strerror(errno));
return;
}
push(buffer, data, bytes);
}
因此,我们遇到了一个巨大的问题:我们如何向 c 中的 read() 函数表明我们已经读取了之前调用的所有信息并且我们不应该再次调用它?
read() 函数会阻塞,直到有字节要通过服务器读取。但是,在我们的模型中,如果由于计数不足而继续尝试读取并且缓冲区中没有任何内容,我们将永远等待。
关于如何在另一个 read() 调用之前指示,没有任何关于传入消息及其结构的先前信息,我们可以从 while 循环中中断并停止尝试从套接字读取的任何想法?