C# TCP Socket Bind에 관해 문의드립니다.

안녕하세요,.

C#으로 Socket Server와 Client를 구현중입니다.

당연히 Server는 IpAddress와 Port를 IpEndPoint로 구성하여 바인딩해주는데,

클라이언트도 바인딩이 가능한데, 문제는 연결을 끊고 재 접속시, 이미 사용중이라는 오류가 뜨더라고요.

서버쪽

//소켓 생성
Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 5000);
Socket.Bind(ipep);
Socket.Listen(5);

클라이언트 쪽

//소켓 생성
Socket createdSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
createdSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
				
var endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 6000);
createdSocket.Bind(endPoint);
                                  
SocketAsyncEventArgs lookingEvent = new SocketAsyncEventArgs();

lookingEvent.RemoteEndPoint =  new IPEndPoint(IPAddress.Parse("192.168.1.100"), 5000);
createdSocket.Bind(endPoint);

lookingEvent.Completed += new EventHandler<SocketAsyncEventArgs>(Connect_Completed);

createdSocket.ConnectAsync(lookingEvent);

이렇게 서버 클라이언트 생성해서 접속 후, 해제 한 다음 재 접속 1회 또는 2회를 반복하니까 이미 사용중인 아이피라고 에러가 뜨네요(System.Net.Sockets.SocketError.AddressAlreadyInUse)

현재 PC에 IP설정이 여러개 되어있어서 클라이언트도 아이피와 포트를 바인딩해주고 싶은데 , 재접속 시 "System.Net.Sockets.SocketError.AddressAlreadyInUse"이 에러 없이 정상적으로 재사용 가능하게 하는 방법이 있을까요?

선배님들의 도움 부탁드립니다.

좋아요 1

재현 가능한 완전한 코드를 공유 주시겠어요? GitHub를 사용하면 그곳을 이용해 공유 주시면 됩니다.

좋아요 1

@dimohy 님 말씀처럼 코드를 공유해주시면 정확한 답변을 얻을 수 있을 것 같고요.

아래 내용도 참고 해보세요.
(프리뷰가 생성되지 않았지만 링크는 걸려있네요.)
http://www.csharpstudy.com/net/article/11-비동기-Socket-서버

좋아요 1

네 알겠습니다~
감사합니다.

좋아요 1

네 감사합니다!!!

좋아요 1

Git으로 올렸습니다.

확인해보셔요.

좋아요 1

아래의 링크를 살펴보세요. 관련해서 성태님이 잘 정리한 글입니다.

TIME_WAIT 상태로 동일 local ip:port를 바로 쓸 수 없는 것은 정상인 것으로 보입니다.

4. TIME_WAIT을 살펴보세요.


https://www.sysnet.pe.kr/2/0/1334?pageno=0

좋아요 1

그러면 사용 바로 다시 접속할수 있는 방법은 없는건가요? 둘다 동시에 끊어준다는 말이 있던데 그게 무슨 말인지 잘 이해가 안되네요…ㅎㅎ 한쪽에서 끊으면 다른한쪽도 당연히 끊어지는 거 아닌가 해서요.

원래 REUSEADDR 옵션을 주면 TIME_WAIT 상태에서 바로 바인딩된 주소를 재사용이 가능한 것으로 알고 있는데… 공유해주신 코드를 보니 이미 REUSEADDR를 적용하셨 더군요.

관련된 자료를 좀 더 찾아보시면 좋겠습니다. (성태님 자료에도 검색하면 있습니다)

제가 지금은 시간이 되지 않아서 추가 답변을 바로 드리기는 힘들 것 같습니다.

제가 몇일째 검색을 해봤는데 못찾겠더라고요. ㅠ
검토해주셔서 감사합니다.

혹시 소켓을 Close 하지않고 바인딩을 시도해서 그런것 아닌가요? 관리자 권한으로 cmd 실행해서 netstat -abno 실행해서 해당 TCP 포트를 프로세스가 점유하고 있는지 확인해보세요…

보통은 클라이언트를 바인드 해서 사용하지 않는데요. 저는 특별한 이유때문에 바인드해서 사용해야되는 상황이 있어서, 그러다보니까 계속 이런문제가 발생하는거거든요.

정상적으로 CLOSE와 DISPOSE 했습니다.

클라이언트 측에 socket.Bind(Client_IP_and_Port)를 안하고 그냥 Remote IPEndPoint만 연결하면, 계속 새로운 포트를 갖고 접속이 이뤄져서 AlreadyInUse socket 오류는 안생기더라고요.