본문 바로가기

Programming/Python

서버 프로그램

서버 프로그램


pwnable.kr과 같은 wargame을 풀다보면 서버와 연결하여 풀어야 하는 문제들이 종종있습니다. 이럴 때 어떻게 사용해야 하는지에 대해서 간단한 서버 프로그램을 만들어 보겠습니다.




위 예제는 간단히 접속만 하는 프로그램입니다.


socket() 함수를 살펴보죠.


AF_INET은 IPv4 인터넷 프로토콜을 말하며, SOCK_STREAM은 TCP를 말합니다. 추가적으로 SOCK_DGRAM은 UDP를 말합니다.


bind()는 소켓을 host 컴퓨터의 prot에 연결하며 listen()은 연결을 원하는 클라이언트가 대기할 수 있는 수를 말하빈다. 당연히 1이상의 수를 갖고 있어야합니다.

accept()는 들어오는 접속 요청을 허용하는 함수입니다.


A 터미널에서 서버를 열어주고 B터미널에서는 서버에 접속합니다.










A 터미널에서 B 터미널로 메시지를 보내도록 하고 싶다면 send()를 사용해야 합니다. client.send("내용") 을 해주면 됩니다.

반대로 client에서 server로 메시지를 보내고 싶을 땐 어떻게 해야 할 까요?


서버에서도 메시지를 받으려면 어딘가 그 데이터를 저장해두어야 하지 않을까요?






A 터미널에서 clinet.recv()를 사용했습니다.  client로 부터 전달되는 것을 받겠다는 의미입니다. 따라서 B 터미널에서 Hello!\n 을 입력하면 A 터미널에 data에 저장이 되고,

data를 출력하면  Hello!\n이 나타나게 됩니다.





그럼 이제 echo 서버를 만들어 보죠.





위 소스코드를 살펴보겠습니다. 추가된 부분은 단지 무한루프를 이용해서 서버에 메시지를 보내면 서버에서 다시 같은 내용으로 보내주는 echo 프로그램입니다.

앞서 예제들을 통해서 설명 했으므로 추가적인 설명은 하지 않겠습니다.





아마 공부를 하다보면 서버와 클라이언트가 연결되어 있는 상태에서 서버를 강제로 종료 후 다시 서버를 열어보셨나요?

아마 다시 실행시키면 다음과 같은 에러 메시지가 나타날 것입니다.




서버 측에서 강제로 종료를 한 후 에 다시 서버를 실행하면 위와 같은 에러 메시지가 발생합니다. 주소가 이미 사용되고 있다고 나오죠.

물론 에러 메시지가 발생하면 포트 번호를 바꿔서 다시 실행하면 정상적으로 실행이 됩니다. 하지만 매번 바꿔줘야 한다면 불편하죠.


해결 방안은 소스코드를 한 줄 더 추가해주는 것입니다.





TCP.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)이 추가 되었습니다.

setsockopt()는 소켓의 옵션 값을 설정하는 함수인데, SOL_SOCKET은 소켓의 특성을 바꿉니다. 

특성은 SO_REUSEADDR을 말하는데, 다시 주소를 사용하도록 설정하는 것이빈다.


위와 같이 소스코드를 한 줄 넣고 실행 후에 서버를 강제로 종료를 해도 다시 실행하면 서버가 정상적으로 작동합니다.

'Programming > Python' 카테고리의 다른 글

웹 페이지 만들기  (0) 2016.03.14
소켓 서버 프레임워크  (0) 2016.03.14
서브 프로세스  (0) 2016.03.14
시그널  (0) 2016.03.14
쓰레딩, 큐  (0) 2016.03.14