【发布时间】:2019-09-25 10:01:33
【问题描述】:
我正在用 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 的最大值时,我认为我有缓冲区溢出。我怎样才能防止这种情况?从文件中读取并将其发回的最佳做法是什么?
【问题讨论】:
-
sent是什么类型?send返回一个ssize_t类型的值 -
我已发送 ssize_t
-
你好像没有检查
send的返回值不小于0,你怎么知道成功了? -
我正在逐步构建这个方法,现在我有一个 printf 可以检查,并且在小文件上一切正常
-
通常最好以块的形式读取文件(例如 8192 字节)并将每个块的写入发送回套接字。这样您就不必分配大量内存来处理此请求。此外,无论如何,您的数据都会在 tcp/ip 级别被分割成块。因此,尝试在一次调用中发送所有信息并没有任何优势。