如何使用整数send()

时间:2013-01-18 13:55:00

标签: c winapi winsock

我有以下代码:

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函数的第二个和第三个字段尝试了不同的组合,但它不起作用,我应该使用什么样的正确语法?

BTW我必须将buffer定义为int *,因为它被其他库使用,必须将其作为int *

4 个答案:

答案 0 :(得分:4)

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

您必须指定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()接受。

请注意,在UDP might not work, due to IP fragmentation上执行非常大的send()。根据我的经验,最好使用许多小数据报发送它。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

使用

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

而不是

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

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

你必须把分配内存的大小而不是指针的大小。分配的内存大小与指向

的指针大小不同

答案 3 :(得分:0)

错误在此行

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

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