【问题标题】:how to use send() with integers如何将 send() 与整数一起使用
【发布时间】:2013-01-18 13:55:00
【问题描述】:

我有以下代码:

int * buffer;
buffer = (int *) malloc((320*240)*sizeof(int));

在用数据填充buffer 后,我想使用 UDP 套接字发送它,但是目前我的以下send 函数似乎只发送 4 个字节(数据)而不是 ((320*240)*sizeof( int)):

iError = send(MySock, (char *)(buffer) , sizeof(buffer), 0);

我在send 函数的第二个和第三个字段上尝试了不同的组合,但它不起作用,我应该使用什么正确的语法?

顺便说一句,我必须将buffer 定义为int *,因为它被其他库使用,必须将其作为int *

【问题讨论】:

  • 阅读任何C FAQ
  • 旁注,似乎需要通过 UDP 一次性传输大量数据。你知道 UDP 不能保证正确的传递吗?

标签: c winapi winsock


【解决方案1】:

这是因为在您的 send() 调用中,您指定了 sizeof (buffer)。这是变量缓冲区的大小,也就是指针的大小,在您的系统上恰好是四个字节。 不是指针指向的块的大小,该信息不可用。

您必须指定320 * 240 * sizeof *buffer 以获得正确的大小。当然,更好的是把它分解成一个变量:

int *buffer;
const size_t buffer_size = 320 * 240 * sizeof *buffer;

if( (buffer = malloc(buffer_size)) != NULL )
{
  /* ... fill buffer ... */
  send(MySock, buffer, buffer_size, 0);
}

无需投射,malloc() returns void *send() 接受。

请注意,send()s 比 UDP might not work, due to IP fragmentation 要大。根据我的经验,最好使用许多小数据报发送它。

【讨论】:

    【解决方案2】:

    sizeof(buffer) 是指针类型的大小,在您的系统上显然是 4 个字节。

    跟踪缓冲区的长度 (320 * 240 * sizeof(int)) 并将其传递给 send()

    【讨论】:

      【解决方案3】:

      使用

      send(MySock, (char *)(buffer) , (320*240)*sizeof(int), 0);
      

      而不是

      send(MySock, (char *)(buffer) , sizeof(buffer), 0);
      

      buffer 是指针类型,对于您的系统,指针的大小为 4 byte(对于其他系统,它可能是 8 个字节(如 64 位机器)

      你必须输入分配内存的大小而不是指针的大小。分配的内存大小和指向的指针大小不一样

      【讨论】:

      • "...指针的大小为 4 字节"。一般来说,不是。
      • 你的意思是对于 32 位系统应该更具体的 4 字节
      • 是的,这就是我的意思,尽管 32 位或 64 位无关紧要。就您而言,指针的大小在 32 位机器上可以是 2 个字节,在 64 位机器上可以是 6 个字节。
      • @netcoder 感谢您的评论,我将答案更新为更具体
      【解决方案4】:

      错误在这一行

      iError = send(MySock, (char *)(buffer) , sizeof(buffer), 0);
      

      您告诉 send 发送指针的大小,即 4 个字节。 你需要给它 (320*240)*sizeof(int)。

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        相关资源
        最近更新 更多