私は多分y'dayから2回この質問をしましたが、私はまだ好意的な答えを得ていません。私の問題は、unsigned char
に格納されているIPアドレスがあることです。今私はクライアントからサーバーにソケット経由でこのIPアドレスを送信したい。人々は私にネットワークバイト転送のためにhtonl()
とntohl()
を使用することを勧めましたが、私はhtonl()
とntohl()
の引数が整数であることを理解できません...どうすればunsigned char
の場合に使用できますか?私がそれを使うことができないなら、どうすれば私のバッファに130.191.166.230
を送っても、受信機はいつも同じものを受け取ることができるのですか?どんなインプットやガイダンスも感謝します。前もって感謝します。int(ソケット用)にcharを型にキャスト
答えて
文字の配列には順序付けが定義されており、エンディアンに依存しません。これらは常に慣習によって低アドレスから高アドレスに動作します。
文字列または4バイトがありますか?
私は4バイト..... – user537670
IP4アドレスは4バイト(別名chars)です。だからあなたは配列のどこかに4つの符号なし文字を持つでしょう。配列をキャストして送信します。
符号なし文字IP [4];
use((char *)IP)を送信するデータバッファとして使用し、そこから4バイトを送信します。
あなたはIPアドレスを形成する("10.0.0.7"
の線に沿って)unsigned char型配列文字列を持っている(と私は非常に少数の32ビットchar
システムが周りにあることから、あなたが行うと仮定することはかなり困難にしていた場合IPアドレスを1つの文字に格納する)場合は、それをそのまま送信して、もう一方の側で使用できるようにすることができます(ASCIIの場合と同じように両方の文字をエンコードすると仮定します)。
一方、バイナリIPアドレスを含む4バイトの文字列(文字は8ビットと仮定)があります。
htonl
とntohl
の使用は、このバイナリデータは両方のビッグエンディアンとリトルエンディアンのシステムが理解できるようにするために経由送信されることを確実にするためです。
このため、ネットワークのバイトオーダー(「ワイヤ上のバイトの順序」)はビッグエンディアンです。したがって、これらの関数はビッグエンディアンシステムでは基本的に何も行いません。リトルエンディアンシステムでは、バイトをスワップします。
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
は、これらの形式について知っており、正しくネットワークバイトオーダーに変換できます。
- 1. (int型、char型**)とint型のmain(int型のargc、char型** ARGV)
- 2. はのconst char型にunsigned char型の*(uint8_t *)をキャスト*
- 3. structをint型にキャストするタイプ
- 4. Appceleratorの:BOMStream BOMStreamWithFileAndSys(int型、off_tでは、size_t型、int型、char型*、BomSys *)
- 5. どのようにスカラにChar/Intをキャストしますか?
- 6. intからlong intへの型キャスト
- 7. Cで左シフト(char)0xFFを8でキャストしてそれをintにキャスト
- 8. static_castはintをcharにキャストできますが、reinterpret_castはキャストできません。
- 9. openCLのchar *をint *にキャストする方法
- 10. 型キャストcharポインタを整数ポインタ
- 11. struct - int型とchar型の配列をソートするには?
- 12. int型のcharへのcharがchar型ではなくJavaのInteger型になる理由
- 13. C - IntsとCharでの型キャスト*
- 14. C++ char配列をintに、intをchar配列に
- 15. c型int *型のキャストポインタをchar *に変換して値にアクセスする
- 16. 「警告:タイプの名前に 'int型への型デフォルト」のconst char型宣言*
- 17. バイトがリストコンストラクタによってint型にキャストされる
- 18. 配列内のchar変数をint型に変換する
- 19. C++:キャストint to charが正しい値を出力しない
- 20. char型の文字を使用してint型を出力しない
- 21. C#はboolをint型にキャストできません
- 22. オブジェクトをint型配列にキャストできません
- 23. どのオブジェクトにint型をキャストするのですか?
- 24. char型のint型データのアドレスを格納するポインタ
- 25. 組み込み型キャストを使用せずにstrとintを変換する
- 26. intをunsigned long longにキャスト
- 27. structをintにキャストする
- 28. swift3 intをindexPathにキャスト
- 29. Int型からdouble型へのキャストをC#erorで
- 30. プログラム引数* charをintとして正しくキャストするには?
満足できる回答が得られない場合は、再度お問い合わせください。元の質問をより明確に編集します。それがそうであるように、あなたが実際に働いていることをあなたが送るのが難しいと言うことはできません。あなたが質問をはっきりと説明できないなら、あなたは良い答えを得られるとは思っていません。 –