[게임 서버] 소켓 프로그래밍 BufferList를 사용하여 한 번에 Send

2022. 6. 18. 16:31·공부/게임 서버
728x90

기존에 만든 서버에서 사용하던 send는 하나의 내용을 한 번 보내고 다음 내용이 올 때까지 대기하고, 다시 하나의 내용을 받으면 그 하나를 보내는 방식이었다. 코드로 보자면

 

void RegisterSend()
{
    _pending = true;
    // send가 될 때까지는 sendQueue에 넣고 실제로 send가 완료됐으면 이어서 queue 확인하고 같은 작업.
    byte[] buff = _sendQueue.Dequeue(); // 빈 buffer가 아니고 우리가 보내는 크기에 맞는 buffer 설정
    // SocketAsyncEventArgs _sendArgs = new SocketAsyncEventArgs();
    _sendArgs.SetBuffer(buff, 0, buff.Length);

	// send를 대기하는 데이터가 있나 확인
    bool pending = _socket.SendAsync(_sendArgs);
    if (pending == false) // 대기 중인 데이터가 없다면, 즉 곧바로 데이터를 보낼 수 있다면
        OnSendCompleted(null, _sendArgs); // 이벤트 핸들러를 호출하지 않고 직접 데이터를 전송해줌
}

 

대충 이런 모양새다. 주석으로 달달 설명을 달아놨다. 이렇게 RegisterSend를 확인하고 pending이 true라면 전송을 대기 중인 데이터가 있다는 뜻이므로 따로 만들어줄 함수인 OnSendCompleted를 실행하면 데이터가 자신의 차례에 전송된다.

 

 

여기서 코드를 더 정리해보자면 데이터를 하나하나 확인해서 전송하는 게 아니라 데이터를 List에 담고 그 List를 통채로 전송하는 방법이 있다. 

 

void RegisterSend()
{
    while (_sendQueue.Count > 0)
    {
        byte[] buff = _sendQueue.Dequeue();
        // 하나하나 보내는 게 아니고 pendinglist를 한 번에 싹 send
        _pendinglist.Add(new ArraySegment<byte>(buff, 0, buff.Length));
    }
    _sendArgs.BufferList = _pendinglist;

    bool pending = _socket.SendAsync(_sendArgs);
    if (pending == false)
        OnSendCompleted(null, _sendArgs);
}

 

이렇게 코드를 수정해볼 수 있겠다. ArraySegment<byte>를 담는 List인 _pendinglist를 생성하여 그 안에 데이터 정보를 하나하나 담는다. sendQueue에 남아있는 데이터가 없을 때까지 이 행동을 반복한다. sendArgs.BufferList에 pendinglist를 담아 한 번에 데이터를 전송한다.

728x90

'공부 > 게임 서버' 카테고리의 다른 글

[게임 서버] Listener, 네트워크 연결을 기다려보자  (0) 2022.06.20
[게임 서버] Listener의 반대 개념, Connector에 대해서  (0) 2022.06.20
[게임 서버] 아주아주 간단하게 만드는 소켓 프로그래밍 환경  (0) 2022.06.17
[게임 서버] 파싱(Parsing)이란?  (0) 2022.06.04
[게임 서버] DNS란?  (0) 2022.06.04
'공부/게임 서버' 카테고리의 다른 글
  • [게임 서버] Listener, 네트워크 연결을 기다려보자
  • [게임 서버] Listener의 반대 개념, Connector에 대해서
  • [게임 서버] 아주아주 간단하게 만드는 소켓 프로그래밍 환경
  • [게임 서버] 파싱(Parsing)이란?
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (238)
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    HTML
    C
    게임서버
    coding
    코딩
    Python
    라즈베리파이
    네트워크
    EFCore
    자바
    유니티
    백준
    디자인패턴
    unity
    EntityFramework
    java
    C#
    tcp
    C언어
    Entityfamework
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[게임 서버] 소켓 프로그래밍 BufferList를 사용하여 한 번에 Send
상단으로

티스토리툴바