6

ソケット経由で int の配列を送信する際に問題があります。コードは次のようになります

プログラム 1: (Windows 上で実行)

int bmp_info_buff[3];

/* connecting and others */

/* Send informations about bitmap */
send(my_socket, (char*)bmp_info_buff, 3, 0);

プログラム 2: (ニュートリノで実行)

/*buff to store bitmap information size, with, length */
int bmp_info_buff[3];

/* stuff */

/* Read informations about bitmap */
recv(my_connection, bmp_info_buff, 3, NULL);
printf("Size of bitmap: %d\nwidth: %d\nheight: %d\n", bmp_info_buff[0], bmp_info_buff[1], bmp_info_buff[2]);

ビットマップのサイズ: 64
幅: 8
高さ: 8を出力する必要があります。

ビットマップのサイズ: 64
幅: 6 高
さ: 4096

4

2 に答える 2

9

bmp_info_buff配列をchar配列として送信する場合、のサイズbmp_info_buff は3ではなく3 * sizeof(int)

同じrecv

交換

send(my_socket, (char*)bmp_info_buff, 3, 0);
recv(my_connection, bmp_info_buff, 3, NULL);

send(my_socket, (char*)bmp_info_buff, 3*sizeof(int), 0);
recv(my_connection, bmp_info_buff, 3*sizeof(int), NULL);
于 2013-01-04T14:01:13.997 に答える
8

サイズ引数send()recv()はバイト単位であり、intsではありません。送信/受信するデータが少なすぎます。

必要なもの:

send(my_socket, bmp_info_buff, sizeof bmp_info_buff, 0);

recv(my_connection, bmp_info_buff, sizeof bmp_info_buff, 0);

また注意してください:

  • これにより、コードはバイトエンディアンの問題に敏感になります。
  • のサイズはintすべてのプラットフォームで同じではありません。これも考慮する必要があります。
  • ポインタ引数をキャストする必要はありません。それはvoid *です。
  • また、戻り値を確認するコードを追加する必要があります。I/Oが失敗する可能性があります。
  • の最後の引数は、コードのようにrecv()すべきではありませんNULL。これは、のようにフラグの整数send()です。
于 2013-01-04T14:00:51.327 に答える