진행하고 있는 개인 프로젝트 중 이러한 기능이 있다.

 

 

안드로이드에서 경로, 파일 명을 입력한 후 버튼을 누르면 서버에 이를 보낸 뒤

해당 프로그램을 실행시켜주는 일종의 원격 기능이다.

그런데 분명 존재하는 경로 및 파일임에도 실행이 안 됐는데, 문제는 (\)백슬래시 문자에 있었다.

 

 

내가 사용하는 키패드의 특수문자 첫 번째 페이지에 보면 ₩ 이러한 문자가 있는데,

이것은 백슬래시 문자가 아니고 한국 화폐 단위(원)를 나타내는 문자다.

백슬래시를 나타내는 문자는 특수문자 2페이지에 따로 있었다. (\)

이 외에 다른 키패드를 확인하던 중 ₩ 이러한 특수문자도 발견했다.

 

\, ₩, ₩ 이렇게 비슷하게 생겼지만 전혀 다르게 인식을 하므로 서버 측에서(또는 클라이언트 측에서) 다음과 같이 replace 함수를 사용해서 이를 잘 변환해줘야 한다.


folder = folder.Replace('₩', '\\'); // (LG) 휴대폰에서 \ 대신에 ₩을 입력하는 경우
folder = folder.Replace('₩', '\\'); // (삼성) 휴대폰에서 \ 대신에 ₩을 입력하는 경우

Posted by 휘진!
,

개인 프로젝트로 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 상태였다.

그래서 같은 컴퓨터에서 서버, 클라이언트를 동작할 때만 통신이 되었었다.

Posted by 휘진!
,