我需要将数据发送到套接字,基本上是传输文件,
根据send()函数docs,它说,
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,我担心的是,返回值可能小于请求值。因为我正在从一个文件读取和写入一个套接字,因为它可能不会发送所有的字节,我猜如果没有发送满的缓冲区,我将不得不重试?在这种情况下,我想我必须以某种方式将同一缓冲区上的指针按读取的字节数前进,然后再次发送它??
我只想知道这是不是真的?或者有没有更聪明的方法,这样所有请求的数据都会被发送,而我不必担心什么时候不是所有数据都被发送了?
谢谢,
发布于 2013-01-07 00:36:29
是的,您必须前进缓冲区指针并重复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),则不能使用此技术;您必须将短发送视为失败。
发布于 2013-01-07 00:36:44
您可以尝试如下所示:
int ret, bytes = 0;
while (bytes < buflen) {
ret = send(sock_fd, buf+bytes, buflen-bytes, flags);
//check for errors
if (ret == -1) {
// handle error
}
bytes+=ret;
}发布于 2013-01-07 00:34:17
是的,您确实需要担心send (或write等)返回的值。没有非常聪明的方法可以绕过它,但有一些由优秀的Richard Stevens编写的函数,即readn和writen。
This article on informit似乎有这些函数的一个版本。
https://stackoverflow.com/questions/14184181
复制相似问题