Socket 문자열 보내기 질문있습니다.

Socket serverSock = new Socket(AddressFamily.InterNetwork, 
    SocketType.Stream, ProtocolType.IP);
serverSock.Bind(new IPEndPoint(IPAddress.Any, 10801));
serverSock.Listen(100);
Socket transferSock = serverSock.Accept();   
byte[] transferStr = Encoding.Default.GetBytes(UserDATA._connectionAddress2);
transferSock.BeginSend(transferStr, 0, 68, SocketFlags.None, 
    new AsyncCallback(sendStr), transferSock);

static void sendStr(IAsyncResult ar)
{
    Socket transferSock = (Socket)ar.AsyncState;
    int strLength = transferSock.EndSend(ar);
}

이런 식으로 서버에서 클라이언트에 문자열을 전송하는 방식입니다.
버튼1 클릭 시 서버와 포트를 열고 클라이언트에서 폼 시작 시 받는 상황인데 클라이언트 프로그램을 껐다가 키면 다시 서버에서 받아올 수가 없습니다.

서버 쪽에 while(transferSock == connected ){} , while(true) 추가를 했을 경우에는 서버 프로그램이 꺼집니다.

해결이 가능할까요?

1개의 좋아요

일단 Accept는 리스너 소켓에 연결 대기 중 상태로 남아있는 원격 소켓을 “1개만” 받아오는 동작을 합니다. 위의 코드에 그래서 계속해서 연결을 받을 수 있도록 반복문을 써주어야 합니다.

그런데 반복문을 쓰면 WPF이든 Windows Forms이든 GUI 애플리케이션은 사용자와 상호작용하기 위해서 메시지 루프를 계속 받아서 처리하는 스레드가 돌아야 하는데, 별도 스레드로 분리하지 않고 이벤트 처리기 안에서 while 문이나 오랜 시간동안 탈출하지 못하는 코드를 삽입하면, 다른 메시지를 더 이상 받지 못하고 앞으로의 실행을 완전히 가로 막기 때문에 프로그램이 응답 없음 상태로 빠져서 종료되는 것입니다.

네트워크 프로그래밍을 하기 앞서, GUI 애플리케이션을 개발하신다면 반드시 윈도우 애플리케이션 기초 동작 원리와 아키텍처에 대해서도 숙지하시는 것이 좋습니다.

그리고, GUI 프로그램에서 네트워크 연결을 받을 수 있는 인터넷 상에 공개되어있는 예제 코드들을 좀 더 살펴보시는 것을 추천드립니다. GUI이든 아니든, 원활하게 연결을 받아서 처리할 수 있게 하기 위해 거의 모두 비동기 프로그래밍을 사용할 것입니다.

1개의 좋아요

네 정보 감사합니다. 쓰레드를 이용해서 딜레이를 주니 해결됐습니다!

1개의 좋아요

말씀하신 방법이 단순히 Thread.Sleep, Thread.SpinWait 메서드나 Task.Delay 메서드를 이용하는 것이라면 제대로 된 해결책이라고 보기 어려울 것 같습니다. 상황이 어떤지 자세히 알 수 없으나, 반드시 다른 네트워크 프로그래밍 예제를 검토하셔서 올바른 방법으로 구현하셨기를 바라겠습니다.

2개의 좋아요