我需要将数据发送到套接字,基本上是传输文件,
根据 send() 函数文档,它说,
If no error occurs, send returns the total number of bytes sent, which can be less than the number requested to be sent in the len parameter. Otherwise, a value of SOCKET_ERROR is returned,
我担心的是,返回值可能小于请求值。 因为我正在从一个文件读取并写入一个套接字,因为它可能不会发送所有字节,我想如果没有发送完整的缓冲区我将不得不重试?在这种情况下,我想我必须以某种方式将同一缓冲区上的指针按字节读取并再次发送??
我只想知道是不是这样?还是有更聪明的方法,以便发送所有请求的数据,而不必担心何时未发送所有数据?
谢谢,
最佳答案
是的,您必须推进缓冲区指针并重复 send
调用,直到整个缓冲区被消耗或出现硬错误。标准习语看起来像这样:
int
send_all(int socket, const void *buffer, size_t length, int flags)
{
ssize_t n;
const char *p = buffer;
while (length > 0)
{
n = send(socket, p, length, flags);
if (n <= 0)
return -1;
p += n;
length -= n;
}
return 0;
}
请注意,如果您要发送边界重要的数据报(例如 UDP),您不能使用此技术;您必须将短发送视为失败。
关于c - C中的send()函数如果没有发送所有字节如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184181/