Microsoft MVP성태의 닷넷 이야기
비동기 소켓 서버 질문 드립니다! [링크 복사], [링크+제목 복사],
조회: 8443
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

안녕하세요^^
아래 코드는 동작되는 것을 직접 확인해보고
질문 드리기 위해 필요한 부분이다라고 생각되는 것만 발췌했습니다...
불필요한 코드가 너무 많으면 답변자도 힘드니까요!

Socket _listenSocket;
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);
bool pending = _listenSocket.AcceptAsync(args);

void OnAcceptCompleted(object sender, SocketAsyncEventArgs args)
{
  if (args.SocketError == SocketError.Success)
  {
    OnAcceptHandler.Invoke(args.AcceptSocket);
  }
  else
    Console.WriteLine(args.SocketError.ToString());
}

static void OnAcceptHandler(Socket clientSocket)
{
  try
  {
      // 받는다.
      byte[] recvBuff = new byte[1024];
      int recvByte = clientSocket.Receive(recvBuff);
      string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvByte);
      Console.WriteLine($"[From Client] {recvData}");

      // 보낸다.
      byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome to Server !");
      clientSocket.Send(sendBuff);
                
      // 끊는다.
      clientSocket.Shutdown(SocketShutdown.Both);
      clientSocket.Close();
  }

  catch (Exception e)
  {
     Console.WriteLine(e.ToString());
  }
}


♣ pending(지연) == false인 경우 : I/O 처리 요청이 운영체제에 전달되자마자 바로 처리됨.

♣ pending(지연) == true인 경우
① I/O 처리 요청만 운영체제에게 전달(접수)만 한 상태
② 이전에 수행하던 작업이 완료되었다면 운영체제는 Comleted 이벤트를 발생하고 ①에서 접수한 I/O처리를 한다.
③ 이때 OnAcceptCompleted(이벤트 처리기)에 있는 OnAcceptHandler를 통해 ①에서 접수한 I/O 처리(데이터를 보내고 받고 끊는 작업)를 수행함.
※ SocketAsyncEventArgs args의 역할은 운영체제와 응용 프로그램 사이에서 데이터 전달, 이벤트 체크 등 일꾼(?) 역할을 한다.

[질문 1] 위에 글은 제가 생각하는 비동기 소켓 I/O 처리를 두 가지 경우로 나누어서 적었는데
혹시 잘못된 개념이 있을까요?

[질문 2] 만약 이벤트 큐라는 곳에 파일 I/O가 들어온 후에 네트워크 I/O가 들어왔다면
운영체제가 파일 I/O를 꺼내서 처리한 후에 네트워크 I/O를 처리했다고 표현하는 것이 맞을까요?
※ I/O : Input/Output ← I/O가 혹시나 다른 뜻으로 쓰일 수 있을까봐 적었습니다.

[질문 3] 혹시 C# 비동기 소켓 원리를 기초부터 배우고 싶다면 운영체제를 배워야 하나요?
아니면 괜찮은 책을 추천해주실 수 있으신가요?
제가 시중에 나온 C# 책을 거의 살펴봤는데 비동기 소켓 원리에 대해 기초부터 자세히 나온 책을
보지 못했습니다.... 제가 컴퓨터 전공도 아니고 배운지 몇 개월 밖에 안 되서 정보가 많이 부족한 것 같습니다ㅠ

[질문 4] 시작하세요! C# 8.0 프로그래밍 208 ~ 209쪽
인터페이스 자체로 의미 부여 예제는
"비어 있는 인터페이스 IObjectToString를 상속받는 클래스들은 묻지도 따지지도 말고 ToString을 재정의!" 라고 이해했습니다.
근데 선생님께서 인터페이스가 없다면 별도의 불린형 필드를 둬서 개발자가 명시해야 해야 한다고 적으셨는데
혹시 코드를 간단하게 보여주실 수 있을까요?

추신) 커피 후원 드디어 만드셨네요! 저는 카카오톡 버전 오류로
친구 카톡으로 오늘 21시 48분에 기부했습니다~! 항상 친절하게 답변해주셔서 정말 감사드립니다.^^








[최초 등록일: ]
[최종 수정일: 12/17/2020]


비밀번호

댓글 작성자
 



2020-12-18 12시17분
답변 1) 이해하신 것이 맞습니다.

답변 2) 큐가 있겠지만, 해당 큐는 device driver마다 관리하는 큐일 것이므로 파일 I/O와 네트워크 I/O가 별도로 관리될 것입니다. 가령 파일 쓰기와 네트워크 쓰기를 비동기로 수행해 각각의 device driver에서 완료가 되었다면 이후 (IOCP 등에 의해) I/O 스레드 풀에서 스레드를 하나씩 빌려와 이후의 동작을 수행하게 될 것입니다. 관련해서 다음의 글을 읽어보시는 것도 도움이 될 것입니다.

C# - 닷넷에서의 진정한 비동기 호출을 가능케 하는 I/O 스레드 사용법
; https://www.sysnet.pe.kr/2/0/12250

답변 3) 거기서 불린형 필드는 object로 다룰 수 있는 것이 아니므로 현실성이 없어 예제를 생략한 것입니다. 즉, 책의 예제대로라면 Person 타입에 "public bool IsOverloaded = true;"라는 필드를 정의해 놓고 외부에서 그 필드의 값을 확인해 보고 ToString을 호출하는 식을 의미합니다.

(후원 감사합니다. 덕분에 이렇게 도네리카노도 알게 되었습니다. ^^)
정성태

... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4829윤현수4/26/201714835System.Text.Encoding 질문 [1]
4828jaem...4/20/201711074시스템 종료시 block 함수 xp 지원가능한 방법 질문 [2]
4827ds4/13/201713066매서드 정의로 이동시 [메타데이터에서]에서 라고 나오는 것은 뭔가요? [1]
4826김솔지4/11/201710329CxImage 문자 출력 [1]
4825플메4/10/201710741덱스트 업로드 하는데 구성요소 서비스에 엑셀이 안뜨네요..ㅜㅜ [1]파일 다운로드1
4824김상경4/9/201710099win7에서 vb6.0을 이용해서 프로그램을 만들었습니다.(제가 만든건 아니고 옆 동료가 만들었습니다.) [1]파일 다운로드1
4823조상현3/28/201711150windows event log 에 대한 정보는 어디서 얻을 수 있을까요? [1]
4822부우3/24/201712808글수정이 안되어 다시올려드립니다ㅠ [12]파일 다운로드2
4821부우3/22/201726467파일이나 어셈블리 중 하나를 로드에러 좀 봐주세요 [9]파일 다운로드1
4820듀이3/20/201711156오차 없이 동시에 명령을 보내게 가능한가요? [2]파일 다운로드1
4819popo3/20/201712477C# sslstream 사용시 Cipher List 설정 [3]
4818부우3/16/201721432DllImport 사용시 진입점을 찾을수 없습니다 [2]
4817yun3/15/201710742서피스프로4의 HYPER-V로 윈도우7을 깔았는데... [1]
4816부우3/15/201713484C++ DLL함수 사용 질문드립니다 [10]
4815김지용3/14/20179543.net core linux 오류 [2]
4814김솔지3/13/201710621인쇄 시 , 출력화면을 이미지 파일로 저장하고 싶습니다. [1]파일 다운로드1
4813spow...3/8/201712170멀티 스레드 환경에서 처리하여야 할 목록을 효율적으로 사용하는 기법 질문 드립니다 [2]
4812popo2/23/201712243.NET Window ClassName 변경 질문 드립니다. [1]
4809힘찬도약2/15/201715301C# 가상 시리얼 [4]
4808이길용2/9/201713994WCF 외부 접속 관련해서 질문드립니다ㅠ [1]
4807헬조선식...2/8/201720620WPF의 속도에 대해서 궁금합니다. [3]
4803헬조선식...2/7/201714022WPF로 메신져 메세지 박스 구현 문의 [2]
4802spow...2/6/201711043특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? [7]
4804spow...2/7/201710915    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은?
4805spow...2/7/201710631    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? (글삭제가 안돼 재첨부합니다)파일 다운로드1
4801spow...2/3/201710505C#의 참조 동작관련하여 아이디어 문의 드립니다 [4]
... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...