0

我的服务器套接字有问题。我正在制作一个网络服务器并试图从浏览器中填充一个。表单 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] 资源暂时不可用”。我没有关闭连接或任何东西,但不知何故我失去了连接。这是我在 python 中用来获取 POST 的代码。

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,或者甚至一次只处理一个客户端)。但是您使用的是非阻塞套接字。

详细信息取决于您的确切代码和平台,但最常见的原因是您调用recv了一个没有数据的非阻塞套接字,并且它正在返回EWOULDBLOCK,并且您的平台具有相同的错误号EAGAINEWOULDBLOCK

如果是这样,简单的答案是:不要将非阻塞套接字与阻塞服务器一起使用。要么确保套接字处于阻塞模式,要么不要调用recv它们,除非你知道有数据(例如,因为select刚刚告诉你)。

可以try通过在阻塞服务器中处理非阻塞套接字recvEWOULDBLOCK以某种方式处理(例如,select仅在该套接字上再试一次,或发送心跳/空闲数据包以确保另一端仍然存在,或其他适合您的设计)。但通常,这不是你想要做的。你可以用settimeout.

于 2013-02-07T22:31:45.803 回答