1

winsock2のsend関数は、charポインターのみを受け入れます。整数またはオブジェクトを送信するにはどうすればよいですか?

4

3 に答える 3

5

const char *buf引数として関数に渡す必要があるsend()のは、バイト配列への単なるポインターです。整数をバイトに変換する必要があります。

const int MAX_BUF_SIZE = 1024;
int int_data = 4;
const char *str_data = "test";

char *buf = (char*) malloc(MAX_BUF_SIZE);
char *p = buf;

memcpy(&int_data, p, sizeof(int_data));
p += sizeof(int_data);

strcpy(p, str_data);
p += strlen(str_data) + 1;

send(sock, buf, p - buf, 0);

free(buf);

そしてコードを読む:

const int MAX_BUF_SIZE = 1024;
int int_data = 0;
const char *str_data = NULL;

char *buf = (char*) malloc(MAX_BUF_SIZE);
char *p = buf;

recv(sock, buf, MAX_BUF_SIZE, 0);

memcpy(p, &int_data, sizeof(int_data));
p += sizeof(int_data);

str_data = malloc(strlen(p) + 1);
strcpy(str_data, p);
p += strlen(p) + 1;

free(buf);

複雑なオブジェクトは、バイトのストリームにシリアル化する必要があります。

注 1: コード サンプルは、サーバーとクライアントの両方が同じプラットフォーム (x32 / x64 / ...) を使用している場合に有効です。つまりint、同じバイト数とバイト オーダーが同じであることを意味します。

注 2: コードを記述する際はMAX_BUF_SIZE、各ステップでバッファ ( ) オーバーフローがないことを確認する必要があります。

于 2011-08-22T08:53:24.267 に答える
0

一般に、最も簡単な方法は、整数またはオブジェクトを文字列に出力し、その文字列を送信することです。テキスト表現は移植性が高く、デバッグも容易です。

std::stringstream文字列を作成し、反対側でそれを解析するのに役立つクラスになる可能性があります。

于 2011-08-22T09:49:39.897 に答える