4

プログラムで、TCP ソケット経由で整数値を送信する必要があります。私は目的のためにsend()andrecv()関数を使用しましたが、それらは文字列としてのみ送受信しています。

整数値を送受信するためのsend()andの代替手段はありますか?recv()

4

3 に答える 3

9

send()recv()文字列を送信しないでください。それらはバイトを送信します。意味のあるバイトの解釈を提供するのはあなた次第です。

整数を送信する場合は、送信する整数のサイズ(1バイト、2バイト、4バイト、8バイトなど)を決定する必要があります。また、エンコード形式も決定する必要があります。「ネットワーク順序」では、ビッグエンディアン形式の規則について説明します。<arpa/inet.h>またはから次の関数を使用して、ネットワーク順序との間で変換できます<netinet/in.h>

   uint32_t htonl(uint32_t hostlong);
   uint16_t htons(uint16_t hostshort);
   uint32_t ntohl(uint32_t netlong);
   uint16_t ntohs(uint16_t netshort);

htonl()送信前(ホストからネットワーク、長い)と受信後(ネットワークからホスト、長い)の使用に固執する場合ntohl()は、問題ありません。

于 2012-06-21T22:26:47.823 に答える
5

もちろん、整数を4バイトとして送信することもできます(または、整数が何バイトであっても)。しかし、あなたは注意しなければなりません。htonl()おそらくでシステムに表示される関数を参照してください<arpa/inet.h>

4バイト整数nを想定すると、これはあなたが望むことをするかもしれません:

uint32_t un = htonl(n);
send(sockfd, &un, sizeof(uint32_t), flags);

次に、受信側で補体をコーディングできます。

を呼び出す理由は、htonl()通常、最上位バイトが最初にインターネット経由で送信されるのに対し、ユビキタスx86などの一部のコンピュータアーキテクチャは最下位バイトを最初に格納するためです。バイト順序を修正せず、一方の端のマシンがx86で、もう一方の端のマシンが別のものである場合htonl()、整数がないと文字化けします。

ちなみに、私はこのトピックの専門家ではありませんが、専門家の回答がない場合はこの回答が役立つ可能性があります。幸運を。

于 2012-06-21T22:25:54.377 に答える
4

私もやってみました。しかし、書き込みはうまくいきませんでした。そこで、別の解決策を見つけました。

// send
char integer[4];                  // buffer
*((int*)integer) = 73232;         // 73232 is data which I want to send.
send( cs, integer, 4, 0 );        // send it

// receive
char integer[4];                  // buffer
recv( s, integer, 4, 0 );         // receive it
于 2013-06-28T21:08:23.127 に答える