TCP 연결 시도할 때 RST, ACK 패킷이 되돌아오는 경우
개인 프로젝트로 C#서버와 안드로이드 클라이언트 간의 TCP 통신을 구현하고 있었다.
컴퓨터에서 안드로이드 이뮬레이터로 localhost로의 통신은 잘 되는데,
apk파일 추출해서 휴대폰에 설치하여 할 때는 이상하게 통신이 되지 않았다.
그래서 WireShark로 패킷을 분석해봤는데
연결을 시도할 때 SYN 패킷은 제대로 전송이 됐는데
서버 컴퓨터에서 SYN 패킷을 받고 RST, ACK 필드가 설정된 패킷을 그대로 클라이언트에게 넘겨줬다.
서버를 꺼둔 상태에서도 똑같은 현상이 일어났다.
분명 서버는 켜둔 상태였고 netstat -na의 결과도 해당 포트에서 LISTENING 상태였는데, 뭐가 문제였을까
// 종단점
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
// 소켓 생성
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 바인드
listenSocket.Bind(endPoint);
위의 코드는 C#에서 서버 초기 세팅할 때의 코드인데
빨갛게 칠한 저 부분을 IPAddress.Parse("127.0.0.1")로 설정해서 생긴 문제였다.
즉 서버측에서 127.0.0.1로만 포트를 열어둔 것이었다.
자세히 확인해보니 netstat -na의 결과도 위의 사진과 같이 로컬주소 127.0.0.1, 외부주소 0.0.0.0으로만 LISTENING 상태였다.
그래서 같은 컴퓨터에서 서버, 클라이언트를 동작할 때만 통신이 되었었다.