2011-07-29 19 views
-1

私は多分y'dayから2回この質問をしましたが、私はまだ好意的な答えを得ていません。私の問題は、unsigned charに格納されているIPアドレスがあることです。今私はクライアントからサーバーにソケット経由でこのIPアドレスを送信したい。人々は私にネットワークバイト転送のためにhtonl()ntohl()を使用することを勧めましたが、私はhtonl()ntohl()の引数が整数であることを理解できません...どうすればunsigned charの場合に使用できますか?私がそれを使うことができないなら、どうすれば私のバッファに130.191.166.230を送っても、受信機はいつも同じものを受け取ることができるのですか?どんなインプットやガイダンスも感謝します。前もって感謝します。int(ソケット用)にcharを型にキャスト

+2

満足できる回答が得られない場合は、再度お問い合わせください。元の質問をより明確に編集します。それがそうであるように、あなたが実際に働いていることをあなたが送るのが難しいと言うことはできません。あなたが質問をはっきりと説明できないなら、あなたは良い答えを得られるとは思っていません。 –

答えて

0

文字の配列には順序付けが定義されており、エンディアンに依存しません。これらは常に慣習によって低アドレスから高アドレスに動作します。

文字列または4バイトがありますか?

+0

私は4バイト..... – user537670

0

IP4アドレスは4バイト(別名chars)です。だからあなたは配列のどこかに4つの符号なし文字を持つでしょう。配列をキャストして送信します。

符号なし文字IP [4];

use((char *)IP)を送信するデータバッファとして使用し、そこから4バイトを送信します。

1

あなたはIPアドレスを形成する("10.0.0.7"の線に沿って)unsigned char型配列文字列を持っている(と私は非常に少数の32ビットcharシステムが周りにあることから、あなたが行うと仮定することはかなり困難にしていた場合IPアドレスを1つの文字に格納する)場合は、それをそのまま送信して、もう一方の側で使用できるようにすることができます(ASCIIの場合と同じように両方の文字をエンコードすると仮定します)。


一方、バイナリIPアドレスを含む4バイトの文字列(文字は8ビットと仮定)があります。

htonlntohlの使用は、このバイナリデータは両方のビッグエンディアンとリトルエンディアンのシステムが理解できるようにするために経由送信されることを確実にするためです。

このため、ネットワークのバイトオーダー(「ワイヤ上のバイトの順序」)はビッグエンディアンです。したがって、これらの関数はビッグエンディアンシステムでは基本的に何も行いません。リトルエンディアンシステムでは、バイトをスワップします。

uint32_t ipaddress = 0x0a010203; // for 10.1.2.3 

ビッグエンディアンレイアウトで0x03,0x02,0x01,0x0aとして、リトルエンディアンで、0x0a,0x01,0x02,0x03として格納されます。つまり

は、次のようなバイナリデータを有することができます。

あなたはネットワークバイトオーダー(エンディアンのシステムが理解できるようになること)にそれを送信したいのであれば、あなただけで行うことはできません。

write (fd, &ipaddress, 4); 

そのリトルエンディアンのシステムからに送信するので、ビッグエンディアンの場合、バイトが反転してしまいます。あなたがする必要がどのような

です:それはもう一方の端のいずれかのプログラムが(それはそれはその目的のために正しいです確保するためにntohlを使用すると仮定して)理解できるネットワークバイトオーダーであることを強制し

uint32_t ipaddress = 0x0a010203; // for 10.1.2.3 
uint32_t ip_netorder = htonl (ipaddress); // change if necessary. 
write (fd, &ip_netorder, 4); 

実際、このスキームは、大小のエンディアン以上のものを処理できます。 ABCD(4バイト)がA,D,B,Cとしてエンコードされている32ビット整数コーディングスキームを使用している場合、または(偶数ビットの最初のビットと奇数ビットの使用のような)奇妙なワイルドビットの混合がある場合でも、これはあなたのローカルhtonlおよびntohlは、これらの形式について知っており、正しくネットワークバイトオーダーに変換できます。

関連する問題