hapter02 연습문제 - 추가 함수 소개

책 61페이지에 존재하는 Chapter02의 연습문제를 풀이하며 알게된 새로운 윈속 함수를 정리하려고 한다.

WSASetLastError

WSASetLastError() 함수는 winsock2.h에 존재하며, WSAGetLastError() 함수를 통해 검색할 수 있는 오류 코드를 설정하는 함수이다.

함수는 아래와 같이 정의되어 있다.

void WSASetLastError(
	int iError
);
  • iError: 추후 WSAGetLastError() 함수 호출에 의해 반환될 오류 코드를 지정하는 정수

WSASocket

WSASocket() 함수는 winsock2.h에 존재하며, 특정 전송 서비스 공급자에 바인딩된 소켓을 만드는 함수socket() 함수와 유시한 기능을 가지고 있다.

함수는 아래와 같이 정의되어 있다.

// 성공: 새로운 소켓, 실패: INVALID_SOCKET
SOCKET WSASocket(
	int					af,
    int					type,
    int					protocol,
    LPWSAPROTOCOL_INFOA	lpProtocolInfo,
    GROUP				g,
    DWORD				dwFlags
);
  • af: 주소 체계 지정
  • type: 소켓 타입 지정
  • protocol: 사용할 프로토콜 지정
  • lpProtocolInfo: 생성할 소켓의 특성을 정의하는 WSAPROTOCOL_INFO 구조체에 대한 포인터이다. NULL이 아니면 소켓은 WSAPROTOCOL_INFO 구조체와 연결된 공급자에 바인딩된다.
  • g: 기존 소켓 그룹 ID 또는 새로운 소켓 및 새로운 그룹을 생성할 때 규칙이다. g가 기존 소켓 그룹 ID가 아닌 경우 아래 값들이 가능하다.
    • 0: 그룹 작업이 수행되지 않는다.
    • SG_UNCONSTRAINED_GROUP(0x01): 제약 없는 소켓 그룹을 만들고 새 소켓을 첫 번째 구성원으로 지정한다. 제한되지 않은 그룹의 경우 Winsock은 소켓 그룹의 모든 소켓이 유형 및 프로토콜 매개변수에 대해 동일한 값으로 생성되도록 제한하지 않는다.
    • SG_CONSTRAINED_GROUP(0x02): 제한된 소켓 그룹을 만들고 새 소켓이 첫 번째 구성원으로 지정한다. 제한된 소켓 그룹의 경우 Winsock은 소켓 그룹의 모든 소켓이 유형 및 프로토콜 매개변수에 대해 동일한 값으로 생성되도록 제한한다. 제한된 소켓 그룹은 연결 지향 소켓으로만 구성될 수 있으며 그룹화된 모든 소켓의 연결은 동일한 호스트의 동일한 주소에 있어야 한다.

      참고
      SG_UNCONSTRAINED_GROUP 및 SG_CONSTRAINED_GROUP 상수는 현재 공용 헤더 파일에 정의되어 있지 않다.

  • deFlags: 추가적인 소켓 속성을 지정하는 데 사용되는 플래그 지정

WSAPROTOCOL_INFO

WSAPROTOCOL_INFO 구조체는 winsock2.h에 정의되어 있으며, 주어진 프로토콜에 대한 완전한 정보를 저장하거나 검색하는데 사용된다.

구조체는 아래와 같이 정의되어 있다.

typedef struct _WSAPROTOCOL_INFO
{
	DWORD            dwServiceFlags1;
	DWORD            dwServiceFlags2;
    DWORD            dwServiceFlags3;
  	DWORD            dwServiceFlags4;
  	DWORD            dwProviderFlags;
  	GUID             ProviderId;
  	DWORD            dwCatalogEntryId;
  	WSAPROTOCOLCHAIN ProtocolChain;
  	int              iVersion;
  	int              iAddressFamily;
  	int              iMaxSockAddr;
  	int              iMinSockAddr;
  	int              iSocketType;
  	int              iProtocol;
  	int              iProtocolMaxOffset;
  	int              iNetworkByteOrder;
  	int              iSecurityScheme;
  	DWORD            dwMessageSize;
	DWORD            dwProviderReserved;
  	CHAR             szProtocol[WSAPROTOCOL_LEN + 1];
} WSAPROTOCOL_INFO, *LPWSAPROTOCOL_INFO;
  • dwServiceFlag1 ~ 5: 프로토콜에서 제공하는 서비스를 설벙하는 비트마스크이다. 가능한 값은 winsock2.h에 정의되어 있으며 추가 프로토콜 속정 정의도 가능하다.
  • dwProviderFlags: 해당 프로토콜이 Winsock 카탈로그에 표시되는 방식에 대한 정보를 제공하는 플래그 집합니다. 가능한 값은 winsock2.h에 정의되어 있다.
  • ProviderId: 서비스 공급자 공급업체가 공급자에게 할당한 GUID(Globally Unique Identifier)이다. 이 값은 둘 이상의 서비스 공급자가 특정 프로토콜을 구현할 수 있는 경우에 유용하며, 응용 프로그램은 ProviderId 멤버를 사용하여 구별할 수 없는 공급자를 구별할 수 있습니다.
  • ProtocolChain: 프로토콜과 연결된 WSAPROTOCOLCHAIN 구조체
  • iVersion: 프로코톨 버전
  • iAddressFamily: 프로토콜에 대한 소켓을 열기 위해 소켓 또는 WSASocket() 함수에 af 매개변수로 전달할 값
  • iMaxSockAddr: 최대 주소 길이(바이트 단위)
  • iMinSockAddr: 최소 주소 길이(바이트 단위)
  • iSocketType: 프로토콜에 대한 소켓을 열기 위해 소켓 또는 WSASocket() 함수에 type 매개변수로 전달할 값
  • iProtocol: 프로토콜에 대한 소켓을 열기 위해 소켓 또는 WSASocket() 함수에 protocol 매개변수로 전달할 값
  • iProtocolMaxOffset: 소켓 또는 WSASocket() 함수에 protocol 매개변수로 전달할 때 iProtocol에 추가될 수 있는 최대값
  • iNetwordByteOrder: 빅 에디안(0) 또는 리틀 엔디안(1)을 나타내는 정수
  • iSecurityScheme: 사용된 보안 체계 유형
  • dwMessageSize: 프로토콜에서 지원하는 최대 메세지 크기(바이트 단위)
  • dwProviderReserved: 서비스 제공업체에서 사용하도록 예약되어 있다.
  • szProtocol: 사람이 읽을 수 있는 프로토콜 이름이 포함된 문자열. 허용되는 최대 문자수는 WSAPROTOCOL_LEN이며 225자로 정의된다.

참고 자료
김성우 저, "TCP/IP 윈도우 소켓 프로그래밍", 한빛아카데미, 2018
https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsasetlasterror
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/ns-winsock2-wsaprotocol_infoa

좋은 웹페이지 즐겨찾기