Send()不发送所有字节
send() not deliver all bytes?
为什么winsock
中的send()
不能保证您请求的所有字节的交付?
这是TCP,它正在阻塞套接字。
类似地,非阻塞时也会发生这种情况。你怎么能保证你把所有的东西都寄了?
我注意到recv()
做同样的。
如果没有发送所有内容,只需再次调用send
即可。如果阻塞,你可以马上做。如果是非阻塞的,您可以等待或使用套接字发现方法(如select
或I/O完成端口)。recv
也是如此。如果你没有得到你想要的,再打电话给recv
。这就是recv
和send
返回发送或接收字节数的原因之一。
传递给send
或recv
的字节数只是一个限制。它可以发送少于这个数的数据(不过,除非是非阻塞的,否则通常不会)。但它肯定能接收到更少的信号。(操作系统无法控制它接收多少数据或何时接收数据。)
TCP为您实现。但是,如果您有一个涉及应用程序级消息的应用程序协议,那么应用程序必须实现它们。这不会奇迹般地发生。TCP不会为您"将字节粘合在一起"到消息中。TCP是字节流协议,而不是消息协议。如果你想要消息,你必须实现它们。
这个行为是"by design".
可以使用外部循环,如下例所示:
int sendBuffer (SOCKET ClientSocket, const char *buf, int len, int flags)
{
int num_left = len;
int num_sent;
int err = 0;
const char *cp = buf;
while (num_left > 0)
{
num_sent = send(ClientSocket, cp, num_left, flags);
if (num_sent < 0)
{
err = SOCKET_ERROR;
break;
}
assert(num_sent <= num_left);
num_left -= num_sent;
cp += num_sent;
}
return (err == SOCKET_ERROR ? SOCKET_ERROR : len);
}
send
告诉您它能够通过返回值发送什么。循环直到send
累计发送完所有数据或返回一个错误。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 如果send()返回x字节,则recv()在一个呼叫中获取相同数量的字节
- Recv-Q+Send-Q>写字节
- send() 函数返回的字节数比 C++ 所需的字节更多
- 不能很好地与send()和recv()一起使用,短字符串的第一个字节丢失了.c++
- Winsock send() 单字节传输的问题
- WinSock 2.2 TCP/IPv4 send()总是返回发送的所有字节
- c++中,Send()函数发送额外的字节
- Send()不发送所有字节