Linux x86_64、gcc、ipv4。
私のIPv4クライアントが誰であるかを知る方法は次のとおりです。まず、クライアント ハンドルから始めます。これはポインターではなく整数です (え?)。次に、宛先 sockaddr 構造体にスペースを割り当て、その長さ (参照として渡される) を保持するために unsigned int にスペースを割り当てる必要があります。次に、整数のクライアント ハンドルと宛先の sockaddress と sockaddress の長さを指定して getsockname() を呼び出します。(内部的には、おそらく getsockname() がカーネルの IP 表現とその他の情報を自分の sockaddr にコピーします。) 次に、sockaddr 構造体で ntoa() を呼び出して文字列を取得する必要があります。最後に、この文字列を整数に変換する必要があります。(getpeername と getsockname の両方もあります。)
これらは私が見た例です。これは移植可能に見えますが、待ち時間が重要なサーバーにとっては非効率的です。しかし、x86_64 アーキテクチャと IPv4 の Linux にとどまりたいとしましょう。カーネルの内部はすでに IP 番号を int としてどこかに保存しているので、ここでのほとんどのラウンドトリップ呼び出しは不要であり、IPv4 は中間ストレージなしで直接かつはるかに高速に検索できると思います。そのような機能は存在しますか?ずっと探しましたが、見つかりませんでした。
getsockname() 関数に、単純に IP 表現を単一の整数として返す代替手段があれば、それは非常に理にかなっています。これにより、コピーを作成する時間とオーバーヘッドも節約できます。これは存在しますか?(PS: ついでに言うと、それが存在する場合、この IP ごとに一意の int を標準の xx.xx.xx.xx 文字列にマップする ntoa() のような呼び出しを行うのが論理的です。中間の sockaddress です。)
そのような関数が存在しない場合、少なくとも、ntoa から文字列への変換と整数への変換を回避できるはずです。これは、sockaddr 構造体のどのバイトが IP を表しているか (またはそのかどうか) を知る必要があることを意味するため、これらのバイトを 4 バイトの C 整数にキャストできます。これはバイト 2 ~ 6 だと思います。右?
/iaw