use*_*454 3 c++ networking byte tcp winsock
为什么没有send()
在winsock
您请求的所有字节的保证交货?
这是TCP,它是阻塞套接字.
同样,这种情况发生在非阻塞时.你怎么能保证你发送一切?
我注意到recv()
了同样的事情.
如果它没有发送所有内容,只需send
再次打电话.如果阻止,您可以立即执行.如果是非阻塞的,您可以等待或使用套接字发现方法(如select
I/O完成端口).同样的道理recv
.如果你没有得到所有你想要的,请recv
再次打电话.这是两者的原因之一,recv
并send
返回发送或接收的字节数.
传递给的字节数send
或recv
只是一个限制.它可以发送少于那个(但是,除非非阻塞,通常不会).但它绝对可以获得少于此.(操作系统无法控制收到的数据量或收到的数据量.)
TCP是为您实现的.但是,如果您的应用程序协议涉及应用程序级别的消息,那么应用程序必须实现它们.魔术不会发生.TCP不会将"将字节粘合在一起"为您的消息.TCP是字节流协议,而不是消息协议.如果您想要消息,则必须实现它们.
这种行为是"按设计".
您可以使用外部循环,如下例所示:
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);
}
Run Code Online (Sandbox Code Playgroud)