공부/Server

윈도우 기반 소켓 프로그래밍 필수 함수

sudo 2021. 7. 31. 02:24
// 성공 시 소켓 핸들, 실패시 INVALID_SOCKET 반환
#include <winsock2.h>
SOCKET socket(int af, int type, int protocol)

af : 프로토콜 체계

type : 소켓 타입

protocol : 호스트간 통신에 사용되는 프로토콜

 

// IP주소와 PORT번호 할당
// 성공 시 0, 실패 시 SOCKET_ERROR 반환
#include <winsock2.h>
int bind(SOCKET s, const struct sockaddr* name, int namelen)

s : socket함수로부터 할당 받은 소켓 핸들

name : IP주소, PORT번호를 할당한 sockaddr구조체 포인터. 보통 SOCKADDR_IN타입의 구조체에 IP주소와 PORT번호를 할당하고 SOCKADDR*로 형변환해서 사용한다

namelen : 2번째 인자인 name의 size

 

// 서버 소켓이 클라이언트 프로그램의 연결 요청을 받을 수 있는 상태가 되게함 
// 성공 시 0, 실패시 SOCKET_ERROR 반환
#include <winsock2.h>
int listen(SOCKET s, int backlog)

s : socket

backlog : client를 대기시켜 놓는 queue의 크기

 

// 성공 시 소켓 핸들, 실패시 INVALID_SOCKET 반환
// 클라이언트가 서버에 연결 요청할 때 까지 리턴하지 않는 블로킹 함수
// 서버에서는 루프속에서 accept -> 서비스 제공 코드 -> close(client_sock)를 반복
#include <winsock2.h>
SOCKET accept(SOCKET s, struct sockaddr* addr, int* addrlen);

s : socket

addr : 연결 요청 한 클라이언트의 주소 정보를 담을 변수의 주소 값. 호출시 addr에 클라이언트의 주소 정보가 채워짐

addrlen : sizeof(addr) 

// 클라이언트에서 서버로 연결 요청시 사용하는 함수
// 성공 시 0, 실패 시 SOCKET_ERROR 반환
#include <winsock2.h>
int connect(SOCKET s, const struct sockaddr* name, int namelen)

s : socket

name : 연결 요청할 서버의 주소 정보를 담은 구조체 주소값

namelen : sizeof(name)

// 윈도우에서 소켓을 닫을 때 호출하는 함수
// 성공 시 0, 실패 시 SOCKET_ERROR 반환
#include <winsock2.h>
int closesocket(SOCKET s)

 

#include <winsock2.h>
int send(SOCKET s, const char* buf, int len, int flags)

s : 데이터 전송 대상 소켓
buf : 보낼 메세지가 담긴 버퍼의 주소
len : 전송할 버퍼 사이즈
flags : 전송 시 적용할 옵션

#include <winsock2.h>
int recv(SOCKET s, const char* buf, int len, int flags)

 

s : 데이터 수신 대상과의 연결을 의미하는 소켓(클라이언트 코드에서는 자기자신의 소켓, 서버 코드에서는 accept함수가 반환한 소켓)
buf : 수신된 데이터를 저장할 버퍼의 주소
len : 수신할 수 있는 최대 바이트 수
flags : 데이터 수신시 적용할 옵션