1

友達、

ノンブロッキング TCP ソケットを使用しています (AIX 上)。connect() を試みたところ、EINPROGRESS が発生しました。私の質問は、接続が完了する前に recv() を呼び出した場合、(最も適切な) エラー コードは何でしょうか?

接続が失敗した場合に備えて、recv() を呼び出すと、ECONNREFUSED が発生することがわかりました。以前の connect() 試行に対応するエラーが発生したことを意味します。同じロジックを使用すると、recv() に対して EINPROGRESS を取得する必要があります。私は私のアプローチで正しいですか?

はいの場合、別の質問が発生します-なぜそのようなエラーコードが recv() のエラーコードに含まれていないのですか?

4

2 に答える 2

3

この場合、読み取るデータがない場合と同じように、EAGAIN が返されるのを見ただけです。接続されていないソケットへの書き込みの場合、通常は ENOTCONN が返されますが、一部のプラットフォームでは EAGAIN が返される可能性があると思います。

デモ用の簡単な Python スクリプトを次に示します。

import socket
# Any address that does not succeed or fail right away will do
ADDR = "192.168.100.100"
PORT = 23
s = socket.socket()
s.setblocking(False)
try:
    s.connect((ADDR, PORT))
except socket.error, e:
    print "Connect gave us",e
try:
    s.recv(1)
except socket.error, e:
    print "Read gave us",e
try:
    s.send("x")
except socket.error, e:
    print "Write gave us",e

私にとって、それは次のようになります:

これらは、それぞれ EINPROGRESS、EAGAIN、および ENOTCONN です。

于 2010-10-31T01:41:36.493 に答える
1

非ブロッキングソケットで操作しています。これは、接続の確立がまだ完了していないことを示す EINPROGRESS を返すのに最適です。これは connect のページに記載されています。

   EINPROGRESS
          The  socket  is  nonblocking  and  the  connection cannot be completed immediately.  It is possible to select(2) or poll(2) for completion by
          selecting the socket for writing.  After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at  level  SOL_SOCKET
          to  determine  whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed
          here, explaining the reason for the failure).

したがって、ソケットが書き込み可能であることを確認し、SO_ERROR からエラーを取得するには、select/pool が必要です。

于 2015-05-18T02:54:00.170 に答える