안녕하세요. 항상 좋은 글 잘 보고 갑니다.
다름이 아니라 도무지 이해가 안되는 부분이 있어서 질문 드립니다.
C#으로 개발한 단일 프로그램으로 Socket 서버를(중계서버) 사용하여 패킷 필터링 및 모니터링을 하려고 합니다.
( A 프로그램 <-> Socket 서버(중계서버) <-> B 프로그램 )
1개의 포트로 중계서버를 이용할 경우 아무런 문제가 없습니다.
하지만 서로다른 여러개의 포트를 이용하여 중계서버를 개설할 경우 Close가 제대로 되지않습니다.
1. 중계서버 프로그램 실행
2. 11220 포트로 서버 개설 -> Listening, Established 2개의 state로 포트가 개방됨을 확인
3. 11221 포트로 서버 개설 -> Listening, Established 2개의 state로 포트가 개방됨을 확인
5. 11220 포트로 개설한 서버 Close -> Listening state로 개방된 포트가 Close 안됨
7. 11221 포트로 개설한 서버 Close -> 정상 종료 되며 11200의 Listening state로 개방된 포트 정상 종료
제일 마지막에 개설한 서버의 경우는 문제가 없으나, 앞서 개설한 서버는 정상종료가 되지 않습니다.
11220 포트로 서버 개설 -> 11221 포트로 서버 개설 -> 11220 포트 서버 Close -> 11220 포트 서버 재개설 -> 이미 개방된 포트로 오류
도무지 이해가 안되는군요.. 혹시 이러한 문제의 이유나 해결방법에 대해서 설명해주시면 감사하겠습니다.
아래는 소스코드는 서버개설 생성자와 메서드 입니다.
메서드는 각각 개별 Thread로 동작 합니다
public SocketServer (String ip, String port, int socketKey) {
ip_TargetServer = ip;
port_TargetServer = int.Parse(port);
port_MyServer = 11220 + socketKey;
}
public void myServerStart () {
Socket TargetServer = null;
Socket myServer = null;
Socket Client = null;
Thread th_server = null;
Thread th_client = null;
try {
// IpEndPoint 설정
IPEndPoint ipep_TargetServer = new IPEndPoint(IPAddress.Parse(ip_TargetServer), port_TargetServer);
IPEndPoint ipep_MyServer = new IPEndPoint(IPAddress.Any, port_MyServer);
// Socket Create Option 설정
AddressFamily af = AddressFamily.InterNetwork;
SocketType stype = SocketType.Stream;
ProtocolType ptype = ProtocolType.Tcp;
// TargetServer 접속
TargetServer = new Socket(af, stype, ptype);
TargetServer.Connect(ipep_TargetServer);
// myServer 개설
myServer = new Socket(af, stype, ptype);
myServer.Bind(ipep_MyServer);
myServer.Listen(1);
// Client가 접속할때까지 대기
Client = myServer.Accept();
// TargetServer -> myServer -> Client 패킷 전송 쓰레드 생성
th_server = new Thread(new ThreadStart(serverToClient));
th_server.Start();
// Client -> myServer -> TargetServer 패킷 전송 쓰레드 생성
th_client = new Thread(new ThreadStart(clientToServer));
th_client.Start();
while (isAlive()) {
continue;
}
} catch (Exception e) {
Console.WriteLine(e);
} finally {
if (th_client != null) {
th_client.Abort();
}
if (th_server != null) {
th_server.Abort();
}
if (Client != null) {
Client.Close(0);
}
if (myServer != null) {
myServer.Close(0);
}
if (TargetServer != null) {
TargetServer.Close(0);
}
}
}
[최초 등록일: ]
[최종 수정일: 9/14/2014]