我有以下代码:
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 *
。
答案 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)。