我正在用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
相同。您将需要一些错误处理才能解决此问题。