send()不会传递所有字节?

use*_*454 3 c++ networking byte tcp winsock

为什么没有send()winsock您请求的所有字节的保证交货?

这是TCP,它是阻塞套接字.

同样,这种情况发生在非阻塞时.你怎么能保证你发送一切?

我注意到recv()了同样的事情.

Dav*_*rtz 7

如果它没有发送所有内容,只需send再次打电话.如果阻止,您可以立即执行.如果是非阻塞的,您可以等待或使用套接字发现方法(如selectI/O完成端口).同样的道理recv.如果你没有得到所有你想要的,请recv再次打电话.这是两者的原因之一,recvsend返回发送或接收的字节数.

传递给的字节数sendrecv只是一个限制.它可以发送少于那个(但是,除非非阻塞,通常不会).但它绝对可以获得少于此.(操作系统无法控制收到的数据量或收到的数据量.)

TCP是为您实现的.但是,如果您的应用程序协议涉及应用程序级别的消息,那么应用程序必须实现它们.魔术不会发生.TCP不会将"将字节粘合在一起"为您的消息.TCP是字节流协议,而不是消息协议.如果您想要消息,则必须实现它们.


Axe*_*per 5

这种行为是"按设计".

您可以使用外部循环,如下例所示:

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)