본문 바로가기

Programming/Ruby, Python

Python TCP/IP 관련 에러메시지 대응

일단 오류가 어떤 형식으로 나오는 지 살펴 보겠습니다.


Exception happened during processing of request from ('xxx.xxx.xxx.xxx', 43933)
Traceback (most recent call last):
  File "C:\Python25\lib\SocketServer.py", line 222, in handle_request
    self.process_request(request, client_address)
  File "C:\Python25\lib\SocketServer.py", line 241, in process_request
    self.finish_request(request, client_address)
  File "C:\Python25\lib\SocketServer.py", line 254, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python25\lib\SocketServer.py", line 522, in __init__
    self.handle()
  File "C:\Python25\lib\BaseHTTPServer.py", line 316, in handle
    self.handle_one_request()
  File "C:\Python25\lib\BaseHTTPServer.py", line 310, in handle_one_request
    method()
  File "C:\Python25\lib\SimpleXMLRPCServer.py", line 478, in do_POST
    self.send_header("Content-type", "text/xml")
  File "C:\Python25\lib\BaseHTTPServer.py", line 376, in send_header
    self.wfile.write("%s: %s\r\n" % (keyword, value))
  File "C:\Python25\lib\socket.py", line 262, in write
    self.flush()
  File "C:\Python25\lib\socket.py", line 249, in flush
    self._sock.sendall(buffer)
error: (10053, 'Software caused connection abort')

이런 식으로 나오는데요, 이 것이 참...
봐 도 잘 모르겠죠? 왜냐하면 제가 짠 소스에서 나오는 문제가 아니거든요.
얼핏 보면 파이선 모듈에서 에러가 난 것 처럼 보이는데요, 그것은 아니고,
자신이 짠 소스에서 네트워크 연결 하는 부분에서 에러가 났다는 것입니다.
저 같은 경우는 xmlrpc 를 이용해서 서버 클라이언트간 통신을 하는 구조 입니다.
그런데 제가 xmlrpc 통신을 할 때, default timeout 을 3초로 잡았더니, local pc 한대에
서버 클라이언트 모듈을 다 설치해서 돌렸을 때는 문제가 안 생기다가, Server Client 가 물리적으로
분리가 되어서 통신할때 생겼다는 것입니다.
왜 이런 문제가 생겼는고 하니
서버 클라이언트 간에 네트워크 통신 을 할경우, socket 이라는 중계자를 이용합니다.
이 socket 은 보통 TCP/IP 기반으로 작동 되는 경우가 많습니다. 서버든 클라이언트 든, socket 을 이용해서 서로 통신을 하게 되는데, 가령, 클라이언트가 서버에게 작업 요청을 했는데, 서버는 이 요청에 응답하는데 시간이 걸려서, 다 끝내고 나서 응답을 하려는데, 성질 급한 클라이언트는 이미 소켓을 끊어버리게 되는 거죠. 이럴 경우, 위와 같은 에러 메시지가 나오게 되는데, 서버, 클라이언트가 입장을 바꾸어서 재현을 해도 똑같은 에러 메시지가 나오게 되는 것이죠.
그래서 서버든 클라이언트든 성질 급한 녀석들보다 조금 인내심이 있는 녀석들을 만들어야겠죠.
가령 timeout 을 적절하게 선정을 한다거나, 아니면, 응답이 올때까지 대기를 한다거나.
두가지의 방법 모두 각각의 tradeoff 가 있으니 잘 섞어서 사용하시면 위와 같은 에러메시지는 보기 힘들겠네요. 오늘은 이만 적고 다음에 또 좋은 글 거리가 있으면 적도록 하죠.