복붙노트

[PYTHON] 파이썬 서버 "일반적으로 각 소켓 주소를 한 번만 사용할 수 있습니다"

PYTHON

파이썬 서버 "일반적으로 각 소켓 주소를 한 번만 사용할 수 있습니다"

파이썬에서 포트를 수신 대기하고 클라이언트가 연결을 시도 할 때 TCP 연결을 만들고 데이터를 수신 한 다음 다시 수신하고 무한정 반복적으로 프로세스를 반복하는 매우 기본적인 서버를 작성하려고합니다. 이것은 내가 지금까지 가지고있는 것이다 :

from socket import *

serverName = "localhost"
serverPort = 4444
BUFFER_SIZE = 1024

s = socket(AF_INET, SOCK_STREAM)
s.bind((serverName, serverPort))
s.listen(1)

print "Server is ready to receive data..."

while 1:
        newConnection, client = s.accept()
        msg = newConnection.recv(BUFFER_SIZE)

        print msg

        newConnection.send("hello world")
        newConnection.close()

때로는 이것이 완벽하게 잘 작동하는 것 같습니다 (브라우저에서 "localhost : 4444"를 지정하면 서버가 HTTP GET 요청을 출력하고 웹 페이지는 "hello world"라는 텍스트를 인쇄합니다). 그러나 마지막 몇 분 안에 서버를 닫은 후 서버를 시작하려고하면 다음과 같은 오류 메시지가 산발적으로 표시됩니다.

Traceback (most recent call last):
  File "path\server.py", line 8, in <module>
    s.bind((serverName, serverPort))
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

나는 파이썬에서 윈도우 7을 사용하여 프로그래밍을하고있다. 이것을 수정하는 방법에 대한 아이디어가 있는가?

해결법

  1. ==============================

    1.bind ()를 호출하기 전에 SO_REUSEADDR 소켓 옵션을 활성화하십시오. 이렇게하면 주소 / 포트를 TIME_WAIT 상태에서 몇 분 동안 멈추지 않고 즉시 재사용하여 늦은 패킷이 도착하기를 기다릴 수 있습니다.

    bind ()를 호출하기 전에 SO_REUSEADDR 소켓 옵션을 활성화하십시오. 이렇게하면 주소 / 포트를 TIME_WAIT 상태에서 몇 분 동안 멈추지 않고 즉시 재사용하여 늦은 패킷이 도착하기를 기다릴 수 있습니다.

    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    
  2. ==============================

    2.Windows에서는 다음 단계를 시도해 볼 수 있습니다.

    Windows에서는 다음 단계를 시도해 볼 수 있습니다.

    # 4444 is your port number
    netstat -ano|findstr 4444
    

    당신은 다음과 같은 것을 얻을 것입니다 :

    # 19088 is the PID of the process
    TCP    0.0.0.0:4444           *:*                                    19088
    
    tskill 19088
    

    행운을 빕니다.

  3. ==============================

    3.@JohnKugelman이 게시 한 기사에서는 SO_REUSEADDR을 활성화 한 후에도 소켓을 사용하여 이전과 동일한 원격 장치에 연결할 수 없다고 명시되어 있습니다.

    @JohnKugelman이 게시 한 기사에서는 SO_REUSEADDR을 활성화 한 후에도 소켓을 사용하여 이전과 동일한 원격 장치에 연결할 수 없다고 명시되어 있습니다.

    나는 당신이 단지 시험 / 놀고있는 것을 본다. 그러나이 오류를 피하려면 연결을 올바르게 종료해야합니다. 운영체제의 tcp 타이밍을 엉망으로 만들 수도 있습니다 : http://www.linuxquestions.org/questions/linux-networking-3/decrease-time_wait-558399/

    테스트 목적으로 round-robin 방식으로 serverPort를 변경하는 것이 좋을 것입니다. 어떻게 생각하십니까?

  4. ==============================

    4.소켓을 닫는 것이 중요합니다 (특히 Windows에서). 그렇지 않으면 Python을 닫은 후 시간 초과가 될 때까지 기다려야합니다.

    소켓을 닫는 것이 중요합니다 (특히 Windows에서). 그렇지 않으면 Python을 닫은 후 시간 초과가 될 때까지 기다려야합니다.

    할 것이다:

    try:
        while 1:
            newConnection, client = s.accept()
            msg = newConnection.recv(BUFFER_SIZE)
    
            print msg
    
            newConnection.send("hello world")
            newConnection.close()
    finally:
        s.close()
    

    도움?

  5. ==============================

    5.서버의 마지막 순간을 멈추지 않고 서버를 재실행하려는 경우 작동하지 않습니다. 현재 순간을 멈추고 싶다면 다음으로 가십시오.

    서버의 마지막 순간을 멈추지 않고 서버를 재실행하려는 경우 작동하지 않습니다. 현재 순간을 멈추고 싶다면 다음으로 가십시오.

    쉘 -> 쉘을 다시 시작하십시오.

    쉘없이 이미 쉘을 닫은 경우 서버를 중지 시키면 백그라운드 관리자로 가서 작업 관리자와 작업 파이썬 프로세스를 종료합니다. 그러면 서버의 마지막 순간이 중지됩니다.

  6. ==============================

    6.포트 번호를 다른 포트 번호로 변경하면 작동합니다.

    포트 번호를 다른 포트 번호로 변경하면 작동합니다.

    if __name__ == '__main__':
        socketio.run(app, debug = True, use_reloader = False, port=1111)
    
  7. from https://stackoverflow.com/questions/12362542/python-server-only-one-usage-of-each-socket-address-is-normally-permitted by cc-by-sa and MIT license