2013-02-07 3 views
0

내 서버 소켓에 문제가 있습니다. 웹 서버를 만들고 브라우저에서 채우기 위해 노력하고 있습니다. 양식 HTML 스크립트와 같은 표시됩니다 : 내가 POST 요청이 타격 후 브라우저에서 보낸 내 터미널에서 전체 요청을 인쇄하려고POST http 요청을받은 후 '자원 일시적으로 사용할 수 없음'- Python

<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 요청을 받으면 소켓에서 '[Errno 35] Resource Unavailable Unreserved'을 throw합니다. 나는 연결을 닫지 않거나 아무것도 아니지만 어떻게 든 연결이 느슨해집니다. 파이썬에서 POST를 사용하기 위해 사용하는 코드는 다음과 같습니다.

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

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

어떤 아이디어가 진행되고 있습니까?

+0

"웹 서버를 만드는 방법"에 대해 더 자세히 알아야합니다. 그러나 일반적으로 비 블로킹 소켓에서 읽으려고 할 때 errno 35 ('EAGAIN')을 얻을 수는 있지만 읽을 데이터는 없습니다. (대부분의 POSIX 플랫폼에서'EWOULDBLOCK : Operation would block '은'EAGAIN : Resource temporarily available'과 같은 에러입니다.) – abarnert

+0

또한'rcvdStr'라인에서 에러가 발생하고 있습니다. = fd.recv (1024)', 그리고 추적 표시가 말하는 것은 ... 그러나 우리가 우리가 짐작할 필요가 없도록 보여 주면 좋을 것입니다. – abarnert

+0

또한 플랫폼에 따라 EAGAIN과 EWOULDBLOCK이 있는지 확인할 수 있습니다. (Windows 사용자 인 경우 대답하지 않으려면 "Windows에 있습니다.") – abarnert

답변

0

이 정확하지 않을 수 있지만, 그것은 가장 가능성이 당신이 제공 한 정보를 기반으로 보인다 :

당신은 자신의 스레드에서 차단 서버 아마 각 클라이언트 연결을 작성했습니다 (하지만 어쩌면 사용하여 프로세스 나 greenlets 대신, 또는 단지 한 번에 하나의 클라이언트를 처리). 하지만 비 블로킹 소켓을 사용하고 있습니다.

세부 정보는 정확한 코드 및 플랫폼에 따라 다르지만 가장 일반적인 이유는 데이터가없는 논 블로킹 소켓에서 recv을 호출했기 때문이며 EWOULDBLOCK을 반환하며 플랫폼이 동일합니다 EAGAINEWOULDBLOCK의 오류 번호

그렇다면 쉽게 대답 할 수 있습니다. 블로킹 서버와 함께 비 블로킹 소켓을 사용하지 마십시오. 소켓이 차단 모드에 있는지 확인하거나 데이터가 없다면 recv을 호출하지 마세요 (예 : select이 방금 그렇게 말했기 때문에).

당신 recv을 보내고 그냥 그 소켓에, 예를 들어, (어떤 방법으로 selectEWOULDBLOCK 처리 try에 의해 차단 서버 소켓을 비 차단 처리하고 다시 시도하거나 확인하기 위해 하트 비트/유휴 패킷을 보낼 수 있습니다 다른 쪽이 아직 거기에 있는지, 아니면 당신의 디자인에 맞는 것이 든간에). 그러나 보통, 그것은 당신이하고 싶은 것이 아닙니다. 당신은 settimeout으로 더 간단한 것을 할 수 있습니다.

관련 문제