3

Python で TCP サーバーをプログラミングしているときに、一方の端または他方の端が予期せず停止したときに、さまざまな条件で発生するいくつかのエラーがあることに気付きました。

たとえば、「パイプが壊れた」( errno.EPIPE) こともあれば、「接続が中止された」(errno.CONNABORTEDまたはerrno.WSAECONNABORTED) になったこともあります。OS 間でコードが同じではないということもありますが、Python のerrnoモジュールがそれを処理していると思います。

探しているものが見つからずに、ソケット接続のエラーコードの意味のリストをたくさん検索しました。

私が今まで持っているものは次のようなものです:

try:
    # write or read operation
except socket.error as e:
    if e.errno in (errno.EPIPE, errno.ECONNABORTED, errno.WSAECONNABORTED):
         print 'Connection lost with server...'

今までは順調に動いていたのですが、最後の追加前にもWindowsで不具合が発生して追加したため、対応できていないケースもあるかと思います。また、時々、エラーをスローせずに空の行を読み続けたり (with でrecv)、不正なファイル記述子などを読み続けたりすることもありました。

SocketServerクラスはそのようなものを提供していますか?それとも一般的なTCP接続ですか?

4

2 に答える 2

1

Pythonで閉じたソケットから読み取ろうとしても、通常は例外は発生しません。recv空の文字列が返されるまで読む必要があります。

socket.errorもちろん、閉じたソケットに書き込むと、OSが発生するエラー番号をラップするExecption( )が発生します。

ただし、エラーコードについてはあまり気にする必要はありません。PythonはCではありません。または、チュートリアルでノンブロッキングソケットについて説明しているように、次のようになります。

リターンコードとエラーコードを確認して、一般的に自分を夢中にさせることができます。あなたが私を信じていないなら、いつかそれを試してみてください。アプリは大きくなり、バグが多く、CPUを消費します。それでは、頭の痛い解決策をスキップして、正しく実行しましょう。

..。

于 2012-11-10T22:26:53.977 に答える
1

Python ソケット モジュールは、BSD ソケット API のほぼ薄いラッパーです。多くの場合、C BSD ソケット API のマニュアル ページを参照すると、考えられるエラー コード (errno 値) に関するドキュメントを見つけることができます。たとえば、man 2 recv次のとおりです。

ERRORS
   These are some standard errors generated by the socket layer.  Additional errors
   may be generated and returned from the underlying protocol modules; see their
   manual pages.

   EAGAIN or EWOULDBLOCK
          The  socket  is  marked  nonblocking  and  the receive operation would
          block, or a receive timeout had been set and the timeout expired before
          data was received.  POSIX.1-2001 allows either error to be returned for
          this case, and does not require these constants to have the same value,
          so a portable application should check for both possibilities.

   EBADF  The argument sockfd is an invalid descriptor.

   ECONNREFUSED
          A remote host refused to allow the network connection (typically because
          it is not running the requested service).

   EFAULT The receive buffer pointer(s) point outside the process's address space.

   EINTR  The receive was interrupted by delivery of a signal before any data were
          available; see signal(7).

   EINVAL Invalid argument passed.

   ENOMEM Could not allocate memory for recvmsg().

   ENOTCONN
          The socket is associated with a connection-oriented protocol and has not
          been connected (see connect(2) and accept(2)).

   ENOTSOCK
          The argument sockfd does not refer to a socket.

マニュアルのページ自体はしばしば不完全ですが、どの Python ドキュメントよりも多くのケースをカバーしています。

于 2012-11-18T13:20:12.860 に答える