【问题标题】:Send() using TCP is not sending the whole array使用 TCP 的 Send() 不会发送整个数组
【发布时间】:2013-04-24 00:14:42
【问题描述】:

我正在尝试将char 数组发送到服务器,但我无法发送整个内容。我发现我没有收到它只发送前四个数据包。

这是我要一次性发送的数据。

char msg1[]={0xff,0xfd,0x03,0xff,0xfb,0x18,0xff,0xfb,0x1f,0xff,0xfb,0x20,0xff,0xfb,0x21,0xff,0xfb,0x22,0xff,0xfb,0x27,0xff,0xfd,0x05,0xff,0xfb,0x23};

这是我用来检查是否所有字节都已发送的函数。如果不。发送其余的。

int send_all(int s,char *buf,int *len)
{
    int total=0; //total bytes sent
    int byteslft= *len; //bytes left to be sent
    int n; //value returned by send() 

    while(total<*len)
    {
        n=send(s,(buf+total),byteslft,0);
        if(n== -1)
            break;

        total +=n; //total bytes sent will be in total
        byteslft -=n; //total bytes left to be sent is stored here
    }

    *len= total;
    return (n==-1)?-1:0;
}

这就是我试图发送它的方式

len=sizeof (*(arr+i)) ;
    if((numbytes=send_all(sockfd,(*(arr+i)),&len))==-1)
    {
        perror("send");
        continue;
    }

为了清楚起见,我已经完成了在此之前的 connect()、socket() 等步骤。

这就是我如何初始化指向msg 数组的指针数组。

char *arr[]={msg1,msg2,msg3,msg4....};

当我调试我的程序时,我看到它只是发送

ff fd 03 ff //message stops sending here

这就是为什么我没有从服务器获得所需的响应。

【问题讨论】:

  • 我已经展示了array是如何初始化的。
  • 请出示arr的声明以及如何初始化它。
  • 顺便说一句,由于您有一个名为byteslft 的变量(无意义的缩写,顺便说一句),您应该在while 循环中使用它。注意while(bytesleft &gt; 0) 的阅读效果比while(total &lt; *len) 好多少?

标签: c sockets network-programming send


【解决方案1】:

表达式*(arr + i) 不是一个实际的数组,而是一个指向数组的指针。这意味着sizeof 操作将返回 指针 的大小(即 32 位,即 32 位操作系统上的四个字节),而不是它所指向的大小。

如果你有实际的数组,你只能使用sizeof 来获取数组的大小,而不是指针。

【讨论】:

  • 我需要获取数组msg1 的大小才能发送数据。我没有意识到它会返回指针大小。有什么办法可以从指针中获取sizeof msg?
  • @ad3 不,没有办法。您可能希望保留第二个数组的大小。
猜你喜欢
  • 2018-11-20
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
相关资源
最近更新 更多