0

サーバーソケットに問題があります。Web サーバーを作成し、ブラウザから入力しようとしています。フォームの HTML スクリプトは次のとおりです。

<html>
<body bgcolor = black text= white>
<FORM method="post" action="/processData.py">
<P>
<LABEL for="firstname">First name: </LABEL>
<INPUT type="text" id="firstname"><BR>

<LABEL for="lastname">Last name: </LABEL>
<INPUT type="text" id="lastname"><BR>

<LABEL for="email">email: </LABEL>
<INPUT type="text" id="email"><BR>

<INPUT type="radio" name="sex" value="Male"> Male<BR>
<INPUT type="radio" name="sex" value="Female"> Female<BR>

<INPUT type="submit" value="Send"> <INPUT type="reset">
</P>
</FORM>
</body>
</html>

「送信」を押した後にブラウザから POST リクエストが送信されたときに、端末にリクエスト全体を印刷しようとしています。Web サーバーで POST 要求を受信すると、ソケットが「[Errno 35] Resource Temporarily Unavailable」をスローします。接続などを閉じているわけではありませんが、どういうわけか接続が失われています。POSTを取得するためにPythonで使用しているコードは次のとおりです。

while not recvIsComplete:
    rcvdStr = fd.recv( 1024 )
    if rcvdStr[0:3] == "GET":
        toGET()

    elif rcvdStr[0:4] == "POST":       
        print rcvdStr

何が起こっているのですか?

4

1 に答える 1

0

これは正しくないかもしれませんが、あなたが提供した情報に基づいている可能性が最も高いようです:

ブロッキング サーバーを作成しました。おそらく、各クライアント接続は独自のスレッドにあります (ただし、代わりにプロセスまたは greenlet を使用するか、一度に 1 つのクライアントのみを処理するだけかもしれません)。しかし、ノンブロッキング ソケットを使用しています。

詳細は正確なコードとプラットフォームによって異なりますが、これを取得する最も一般的な理由は、recvデータのないノンブロッキング ソケットを呼び出したために が返され、プラットフォームでとEWOULDBLOCKに対して同じエラー番号が発生したことです。EAGAINEWOULDBLOCK

その場合、簡単な答えは次のとおりです。ブロッキング サーバーで非ブロッキング ソケットを使用しないでください。ソケットがブロッキング モードになっていることを確認するか、recvデータがあることがわかっていない限り (たとえば、selectそのように言われたなど) ソケットを呼び出さないでください。

ブロッキング サーバーで非ブロッキング ソケットを処理するtryには、何らかの方法で を処理します (たとえば、そのソケットだけで再試行するか、ハートビート/アイドル パケットを送信して反対側がまだそこにあることを確認するなど)。設計に適しています)。しかし、通常、それはやりたいことではありません。でもっと簡単にできます。recvEWOULDBLOCKselectsettimeout

于 2013-02-07T22:31:45.803 に答える