3

この行で古いコードを取得しました:

getpeername(0, (struct sockaddr *)&sin, &namelen)

は何をしgetpeername(0,...)ますか?それはすべてのOSで動作しますか?SUN でコンパイルして実行しようとすると、これが得られます => 非ソケットでのソケット操作 インターネットで調査を行いましたが、この行を使用する理由がわかりませんでした。「localhost」が返されます。

ありがとう

4

3 に答える 3

3

STDIN であるファイル記述子 0 のピア、つまりネットワークの反対側のホストを探します。

これはおそらく、標準入力がソケットにリダイレクトされたかどうかを確認する簡単な方法です。これはinetdスタイルのデーモンではよくあることです。エラーが返された場合は通常のデーモンとして開始されましたが、成功した場合はinetdデーモンとして開始され、まさにこのソケットがデーモン操作に使用されます。 .

于 2013-01-30T19:30:02.007 に答える
0

試してみてくださいman getpeername。これは POSIX API であるため、UNIX および Linux プラットフォームでサポートされる必要があります。

最初の引数は、接続されたソケットの fd でなければなりません。ピア (反対側) のアドレスを入力します。length 引数の使用方法の詳細: man ページを参照

fd 0 (stdin) がソケットにバインドされている場合にのみ、呼び出しが機能します。

これは通常、inetd によって開始されたサーバーの場合ですが、コンテキストについては教えてくれません。

タグを変更したい場合があります。これは UNIX ソケットに関する質問ですが、C++ とは特に関係ありません。

于 2013-01-30T19:28:58.253 に答える
0

ファイル記述子0は通常、ソケットではなく標準入力であるため、このエラーが発生しています。元の作者が何を意図していたのかはわかりませんが、このままではうまくいかないはずです。たぶん、もう少し文脈があれば、さらにあなたを助けることができます.

于 2013-01-30T19:29:02.473 に答える