출처: TCP/IP 윈도우 소켓 프로그래밍(https://product.kyobobook.co.kr/detail/S000001636201)
1. 생성
윈속 초기화가 성공했으면 이제 소켓을 생성할 준비가 된 것이다. 소켓을 사용한 통신의 기본 요건은 양 끝단이 모두 같은 프로토콜을 사용하는 것이다.
socket()
함수는 사용자가 요청한 프로토콜을 사용해 통신할 수 있도록 내부적으로 리소스를 할당하고, 이에 접근할 수 있는 핸들(SOCKET
타입, 32비트 정수)을 리턴한다. 이를 소켓 디스크립터라 부르며, 각종 소켓 함수의 인자로 전달해 사용한다.
// 성공: 새로운 SOCKET(32비트 정수)
// 실패: INVALID_SOCKET
SOCKET socket {
int af,
int type,
int protocol
};
af
: 주소 체계를 지정한다.type
: 소켓 타입을 지정한다.protocol
: 사용할 프로토콜을 지정한다.
1.1 주소 체계
주소 체계는 통신 상대를 유일하게 지정할 수 있는 주소를 지정하는 방법을 의미한다. 주소 체계는 프로토콜에 따라 달라진다.
winsock2.h
또는 ws2def.h
파일을 찾아보면 AF_
로 시작하는 상수를 찾을 수 있는데, 자신에게 필요한 상수를 찾아 socket
함수의 첫 번째 인자로 전달해주면 된다. IPv4 기반의 TCP, UDP 프로토콜을 사용하려면 AF_INET
을 선택한다.
1.2 소켓 타입
소켓 타입은 사용할 프로토콜의 특성을 나타내는 값이다. 자주 사용하는 소켓 타입을 요약하면 다음과 같다.
# SOCK_STREAM: 신뢰성 있는 데이터 전송 기능 제공, 연결형 프로토콜
# SOCK_DGRAM: 신뢰성 없는 데이터 전송 기능 제공, 비연결형 프로토콜
소켓 타입은 프로토콜에 따라 달라진다. TCP나 UDP 프로토콜을 사용하려면 주소 체계와 소켓 타입을 다음과 같이 설정해주면 된다.
- TCP 사용:
AF_INET or AF_INET6
+SOCK_STREAM
- UDP 사용:
AF_INET or AF_INET6
+SOCK_DGRAM
주소 체계가 같더라도 소켓 타입이 다르면 최종적으로 사용할 프로토콜이 달라지는 것을 주목해야 한다.
1.3 프로토콜
주소 체계와 소켓 타입만으로도 프로토콜을 결정할 수 있는 경우도 있지만, 일반적으로는 주소 체계와 소켓 타입이 같아도 이에 해당하는 프로토콜이 두 개 이상 존재할 수 있다.
이런 경우에는 프로토콜을 명시적으로 지정해준다. socket
함수의 세 번째 인자가 이 역할을 한다. 일반적으로 TCP나 UDP는 주소 체계와 소켓 타입으로 프로토콜을 결정할 수 있기 때문에 0을 사용해도 된다.
2. 닫기
소켓을 사용한 통신을 마치려면 관련 리소스를 반환해야 한다. closesocket
함수를 사용하자.
// 성공: 0
// 실패: SOCKET_ERROR
int closesocket(
SOCKET s
);
3. 초기화 - 생성 - 닫기 - 종료
#pragma comment(lib, "ws2_32")
#include <winsock2.h>
// 소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);
LocalFree(lpMsgBuf);
exit(1);
}
int main(int argc, char *argv[])
{
// 윈속 초기화
WSADATA wsa;
// 윈속 2.2 버전 요청
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
return 1;
MessageBox(NULL, "윈속 초기화 성공", "알림", MB_OK);
// 소켓 생성
// socket()
// IPv4 + SOCK_STREAM = TCP
SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
if (tcp_sock == INVALID_SOCKET) err_quit("socket()");
MessageBox(NULL, "TCP 소켓 생성 성공", "알림", MB_OK);
// 소켓 닫기
// closesocket()
closesocket(tcp_sock);
// 윈속 종료
WSACleanup();
return 0;
}
'네트워크 > 윈도우 소켓 프로그래밍' 카테고리의 다른 글
TCP 클라이언트 함수 (0) | 2024.04.05 |
---|---|
TCP 서버 함수 (0) | 2024.04.05 |
소켓 주소 구조체 다루기 (0) | 2024.04.04 |
윈도우 소켓 애플리케이션 초기화 및 종료 (0) | 2024.04.01 |
일반적인 윈도우 소켓 함수의 오류 처리 (0) | 2024.04.01 |