プログラムで、TCP ソケット経由で整数値を送信する必要があります。私は目的のためにsend()
andrecv()
関数を使用しましたが、それらは文字列としてのみ送受信しています。
整数値を送受信するためのsend()
andの代替手段はありますか?recv()
プログラムで、TCP ソケット経由で整数値を送信する必要があります。私は目的のためにsend()
andrecv()
関数を使用しましたが、それらは文字列としてのみ送受信しています。
整数値を送受信するためのsend()
andの代替手段はありますか?recv()
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()
は、問題ありません。
もちろん、整数を4バイトとして送信することもできます(または、整数が何バイトであっても)。しかし、あなたは注意しなければなりません。htonl()
おそらくでシステムに表示される関数を参照してください<arpa/inet.h>
。
4バイト整数nを想定すると、これはあなたが望むことをするかもしれません:
uint32_t un = htonl(n);
send(sockfd, &un, sizeof(uint32_t), flags);
次に、受信側で補体をコーディングできます。
を呼び出す理由は、htonl()
通常、最上位バイトが最初にインターネット経由で送信されるのに対し、ユビキタスx86などの一部のコンピュータアーキテクチャは最下位バイトを最初に格納するためです。バイト順序を修正せず、一方の端のマシンがx86で、もう一方の端のマシンが別のものである場合htonl()
、整数がないと文字化けします。
ちなみに、私はこのトピックの専門家ではありませんが、専門家の回答がない場合は、この回答が役立つ可能性があります。幸運を。
私もやってみました。しかし、書き込みはうまくいきませんでした。そこで、別の解決策を見つけました。
// 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