Study/Python

[Network/Python] socket으로 데이터 주고받기 (+ 삽질)

growingtree 2021. 3. 28. 17:03

 

 

 

 

 

네트워크 프로그래밍 과제 중 에러가 생겨 약 1시간 넘게 구글링 + 코드수정을 진행했다.

하지만 에러의 원인은 변수명을 잘못썼기 때문이였음ㅋ 

 

 

 

과제는 서버 코드 , 클라이언트 코드를 각각 작성해서 클라이언트 쪽에서 내 이름을 서버로 보내면, 서버에서 그걸 받아서 출력해주는 아주 간단한(?) 과제였다.

 

서버랑 클라이언트 코드를 짠 후 클라이언트에서 내 이름을 보내면 서버에서 받지못하고 자꾸 에러를 냈다. 

 

 

OSError : [WinError 10057] 소켓이 연결되어 있지 않거나 Sendto 호출을 사용하여 데이터 그램 소켓에 보내는 경우에 주소가 제공되지 않아서 데이터를 보내거나 받도록 요청할 수 없습니다. 

 

 

에러의 내용 + 구글링의 결과 서버와 클라이언트 사이의 연결에 문제가 있는 것 같았다. 

stackoverflow.com/questions/28877472/python-socket-winerror-10057

 

 원인은 알겠지만 어디서 문제가 일어났는지 도통 감을 잡을 수 없었다@@

변수 이름이 중복된걸까? 아니면 recv() 안의 파라미터값을 바꿔야하는건가?..bind의 주소값을 잘못한건지.. 

 

코드를 이리저리 바꿔보다가 문제점을 찾아냈다.

바로 내가 잘못 알고 있었던 것 ! 

 

서버에서는 소켓이 두 개가 생기는데 

1. 클라이언트와 '연결'을 해주기 위한 서버쪽 소켓

2. 클라이언트에 연결, 접속할 수 있는 소켓

 

1번의 경우는 코드상에서 변수 s에 해당한다. 

s는 딱 while 반복문 위에까지만 등장하는데, s가 바로 클라이언트와 연결해주기 위한 서버쪽의 소켓이다.

 

2번은 while 문 안에서 쓰이는 client 변수이다.

코드에서 보면 client는 s.accept()의 return 값을 받는데 이것이 이후 클라이언트와 통신하기 위해 사용되는 소켓이다.

 

따라서 while문 안에서는 s로 접근하는 것이 아니고 client 변수로 접근을 해야했던 것 

 

수업시간에 별표도 쳐놓고 잊어버린 나란 사람..^^

 

 

 

 

반응형