2017-10-24 2 views
0

저는 라즈베리 파이가 파이썬 asyncore 서버를 호스팅하는 프로젝트에서 일하고 있습니다. 그리고 약간의 arduino가 LAN을 통해 연결합니다. 우리는 서버에 거의 버그가 없지만 뭔가 잘못되어 서버가 중단되면 서버를 다시 시작할 때 주소가 사용 중임을 나타냅니다. 주소가 사용 중이면 주소가 설정 될 때까지 다시 시도하지만 꽤 오랜 시간이 걸릴 수 있도록 코드를 작성했습니다.사용 시간에 소켓 주소를 줄일 수 있습니까?

이제 Linux에서 주소를 설정하기 전에 시간을 편집 할 수 있다고 들었습니다. 예를 들어, 내 맥북에서 소켓 주소는 10 초 후에 무료로 설정됩니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

답변

1

시도가 (이 경우 인 경우) 즉시 해제 자원을 수행하는 대신 close 메소드의 종료를 사용 : 또한 https://docs.python.org/2/library/socket.html#socket.socket.shutdownhttp://www.unixguide.net/network/socketfaq/2.6.shtml

를 소켓 호출에서 다음과 같은 설정이 도움이 http://man7.org/linux/man-pages/man7/socket.7.html 될 수 있습니다

  • SO_REUSEADDR
  • SO_REUSEPORT
  • SO_RCVTIMEO
  • SO_SNDTIMEO
  • 실행 사이의 너무 작은 지연 예를 들어 여러 번 실행
+0

우리는 이미 그렇게하지만 일이 항상 일어날 수있는 잘못 수행 할 때, 우리는 가능한 한 빨리 백업 서버를 얻을 수 있어야합니다. 귀하의 답변 주셔서 감사합니다, 그것은 전체 코드를 제외하고 시도하고 예외가 우리가 먼저 소켓을 그런 식으로 닫은 다음 서버를 다시 시작 제외하고 사용할 수 있습니다. – Jurze

+0

또한 'socket.shutdown()'은 적시에 연결을 닫는다고 반드시 의미하지는 않습니다. – Jurze

+0

"빨리 서버를 백업하십시오."라는 것이 무슨 뜻인지 모르겠지만, 아마도 http://man7.org/linux/man-pages/man7/socket.7.html 소켓의 사람을 읽고 다음을 살펴보십시오. SO_REUSEADDR SO_REUSEPORT SO_RCVTIMEO 및 SO_SNDTIMEO – bluszcz

0

이 오류가 발생할 수 :

socket.error: [Errno 98] Address already in use 

이전 실행이 TIME_WAIT 상태에있는 소켓을 떠난 등이 될 수 없기 때문입니다 즉시 재사용됩니다.

설정하는 소켓 플래그,이를 방지하기 위해, socket.SO_REUSEADDR 있습니다 :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
s.bind((HOST, PORT)) 

SO_REUSEADDR 플래그에 자연 제한 시간을 기다리지 않고, TIME_WAITstate에서 로컬 소켓을 재사용 할 커널을 알려줍니다 내쉬다.

소스 ->