我的服务器套接字有问题。我正在制作一个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请求时在我的终端上打印整个请求。当我在我的网络服务器上收到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
有什么想法吗?
答案 0 :(得分:0)
这可能不正确,但似乎很可能基于您提供的信息:
您已经编写了一个阻塞服务器 - 可能是每个客户端连接都在自己的线程中(但可能使用进程或greenlet,或者甚至可能只是一次只处理一个客户端)。但是你正在使用非阻塞套接字。
详细信息取决于您的确切代码和平台,但最常见的原因是您在非阻塞套接字上调用recv
且没有数据,并且它返回EWOULDBLOCK
,您的平台与EAGAIN
和EWOULDBLOCK
具有相同的错误编号。
如果是这样,简单的答案是:不要将非阻塞套接字与阻塞服务器一起使用。确保套接字处于阻止模式,或者不要在它们上面调用recv
,除非您知道有数据(例如,因为select
刚刚告诉您)。
您可以通过try
recv
处理阻止服务器中的非阻塞套接字并以某种方式处理EWOULDBLOCK
(例如{{}只在那个套接字上再试一次,或发送一个心跳/空闲数据包以确保另一面仍在那里,或者适合你的设计的任何东西)。但通常,这不是你想要做的;你可以用select
做一些更简单的事。