1

私は次のコードを持っています:

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

データを入力した後、bufferUDP ソケットを使用して送信したいのですが、現在、次のsend関数は ((320*240)*sizeof(int)) ではなく 4 バイト (データ) のみを送信しているようです:

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

send関数の 2 番目と 3 番目のフィールドでさまざまな組み合わせを試しましたが、うまくいきません。正しい構文は何を使用すればよいですか?

ところで、 asを取得する必要がある他のライブラリで使用されているため、 bufferasを定義する必要があります。 int *int *

4

4 に答える 4

4

これは、send()呼び出しで を指定したためですsizeof (buffer)。これは変数バッファーのサイズであり、ポインターのサイズであり、システムではたまたま 4 バイトです。ポインターが指すブロックのサイズではなく、その情報は利用できません

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()返しvoid *send()受け入れます。

非常に大きなsend()s をUDP 経由で実行すると、IP フラグメンテーションが原因で機能しない可能性があることに注意してください。私の経験では、多くの小さなデータグラムを使用して送信することをお勧めします。

于 2013-01-18T13:57:48.233 に答える
2

sizeof(buffer)はポインタ型のサイズで、システムでは明らかに 4 バイトです。

バッファ ( ) の長さを追跡し、320 * 240 * sizeof(int)それを に渡しsend()ます。

于 2013-01-18T13:57:09.433 に答える
1

使用する

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

それ以外の

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

bufferはポインター型であり、ポインターのサイズは4 byteシステム用です (他のシステムの場合、8 バイト (64 ビット マシンなど) になる可能性があります)

ポインタのサイズではなく、割り当てられたメモリのサイズを入力する必要があります。割り当てられたメモリのサイズは、指しているポインタのサイズと同じではありません

于 2013-01-18T13:56:43.243 に答える
0

エラーはこの行にあります

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

4バイトのポインターのサイズを送信するようにsendに指示しています。(320*240)*sizeof(int) を指定する必要があります。

于 2013-01-18T13:57:53.913 に答える