我正在用C语言编写一个TCP服务器,但是在发送时遇到了问题。我读取本地文件并将数据发送回客户端,当文件较小时,我没有问题,但是当文件较大时,我遇到了这种奇怪的情况:

服务器tcp:

 // create socket, bind, listen accept

// read file
fseek(fptr, 0, SEEK_SET);
// malloc for the sending buffer
ssize_t read = fread(sbuf, 1, file_size, fptr);

while(to_send>0) {
  sent = send(socket, sbuf, buf_size, 0);
  sbuf += sent;
  to_send -= sent;
}


在发送的巨大文件上,它等于size_t的最大值,我认为我有缓冲区溢出。我该如何预防?从文件读取并将其发送回的最佳实践是什么?

最佳答案

问题是,即使没有那么多的内存,每次也发送buf_size个字节。

例如,假装buf_size为8,并且您要发送10个字节(因此,最初,to_send也是10)。第一个send发送8个字节,因此您需要再发送2个字节。第二次,您还发送8个字节(可能超出范围)。然后,to_send将为-6,与SIZE_MAX - 5相同。

一个简单的解决方法是发送to_send(如果较小):

sent = send(socket, sbuf, to_send < buf_size ? to_send : buf_size, 0);


另外,如果send不成功,则返回-1。将其分配给SIZE_MAX时,它与size_t相同。您将需要一些错误处理才能解决此问题。

07-24 13:40