TCP서버(리스너)소켓 관련 질문입니다.

현재 잘돌아가고 ? 있는 오픈소스를 보고 있습니다.
서버소켓쪽에서 대체로 이런식으로 구현하잖아요.
bind 인자로 서버쪽 IP/Port (서버 EndPoint)

클라이언트에서 Connect(서버쪽 EndPoint) 해서 TCP 스트림을 보내고요

문제는 클라이언트가 여러개일 때
서버소켓에서 Accept 해서 클라이언트 소켓을 받아오잖습니까? 그 소켓에 대한 정보를 알수 있고요
예를들어 EndPoint 말입니다.
그런데 혹시 Bind 시에 즉 Accept 전에 소켓이나 바인드 정보를 알 수가 있나요?

m_ListenSocket = new Socket(EndPoint, Stream, Tcp);
m_ListenSocket.Bind(EndPoint);
m_ListenSocket.Listen(BackLog);
SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs();
acceptEventArg .Completed += new EventHandler(acceptEventArg_Comple);

말씀하시는 내용은 크게 셋으로 해석이 되는데요,

a. 리스닝 소켓의 IP 주소와 포트 번호를 확인할 수 있는가

이미 m_ListenSocket 소켓을 초기화하는 시점에서 EndPoint에 IP 주소와 포트 번호를 기재해서 Bind 메서드를 호출하고 계신데, 구체적으로 어떤 세부 정보를 더 확인하고 싶으신지 알고 싶습니다.

b. 리스닝 소켓이 Accept로 클라이언트 연결을 수신하기 전에 클라이언트 IP 주소를 알 수 있는가

알 수 없습니다. Accept로 연결을 맺은 상태에서만 수신된 연결에 대한 정보를 알 수 있습니다.

c. 여러 클라이언트 연결을 처리하기 위해서 Accept 메서드를 사용했지만 블로킹이 걸려서 다음 연결을 처리하지 못하고 있다.

연결을 Accept로 받은 이후 다음 소켓에 대한 정보를 미리 얻고 싶다는 취지에서 질문하신 부분이라면, Accept는 동기식 메서드이기 때문에 목적을 달성할 수 없습니다. 비동기 방식의 BeginAccept/EndAccept 짝을 사용하더라도, 2에서 말씀드린 것처럼 소켓 연결이 맺어지기 전에 클라이언트 측의 정보를 얻을 수 있는 방법은 없습니다.

소켓 프로그래밍을 할 때는 비동기 방식의 I/O를 사용하는 것이 정석입니다. 이는 C, C++을 포함하여 모든 버클리 소켓 API들이 기본으로 전제하는 사항이며, 비동기 프로그래밍 기법은 매우 다양합니다. C# 기준으로는 다음의 Microsoft Docs 아티클을 참고하시면 도움이 될 것 같습니다.

3개의 좋아요

B 의 내용을 알고 싶었던 거였습니다.
Aceept 이후에만 가능하다고 하니 어쩔수 없는 사항이었네요.

약속된 서버와 클라이언트간의 통신이지만 서버의 IPEndPoint 알아내어 커넥션 시도를 할 때
서버쪽에 어떻게 방어가 가능한건지 알고 싶어서 질문했습니다.
클라이언트의 EndPoint 를 소켓통신Api에서 필터링함수등이 있을 듯 해서요

일반적으로 TCP 소켓 프로그래밍의 흐름은 다음과 같습니다.

출처: Socket Programming in C/C++ - GeeksforGeeks

만약 연결을 맺는 시점에서의 ACL 관리를 필요로 하신다면, 이는 애플리케이션 수준이 아니라 커널 드라이버 수준, 혹은 방화벽 정책 수준에서 통제가 이루어져야 할 부분입니다. 이 경우, 닷넷에서 코드를 작성하는 것 만으로는 충분하지 않을 수 있습니다.

3개의 좋아요