Programming Languages/C

[WSA] WinSock 실행 흐름

ubiquitous4g 2021. 9. 7. 22:01

소켓 통신 프로그래밍

  API / 클래스 설명 제공 기능 OS/PL
Unix Socket API 네트워크 표준 API TCP, UDP 등 다양한 네트워크에 사용 Unix(Ubuntu, Redhat..)
Win WinSock2 API Socket API 윈도우 버전 Window(C/C++)
C#
.NET
Sockets WinSock2 API C# 버전 Window(C#)
TcpClient Sockets 클래스 내재됨 TCP, UDP 전용
TcpListner
UdpClient

윈도우 소켓 실행 흐름

WSA(WinSock API)

WSAStartup( )

: winsock 초기화 : 반드시 프로그램에서 요구하는 winsock 버전을 명시하고, 라이브러리 초기화를 진행해야 한다.

#include <winsock2.h>

int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);

// 성공시 0, 실패시 0이 아닌 에러코드
// wVersionRequired : 윈속 버전 정보
// lpWSAData        : WSADATA 구조체 변수 포인터
WSAStartup(MAKEWORD(2,2), &wsaData)

// MAKEWORKD 매크로를 이용해 윈도우 소켓 버전을 명시한다.
// winsock 버전 1.2의 경우, MAKEWORD(1, 2)는 0x0102 상위 8비트 주 버전 1, 하위 8비트 부 버전 2 
// winsock 버전 2.2의 경우, MAKEWORD(2, 2)는 0x0202 상위 8비트 주 버전 2, 하위 8비트 부 버전 2
int main(int argc, char* argv[])
{
    WSADATA wsaData;
    ...
    if(WSAStartup(MAKEWORD(2,2), &wsaData))
    	ErrorPrint("WSAStartup() error!");
    ...
    return 0;
}

WSAcleanup( )

:  winsock 해제

int WSAStartup(void);
// 성공시 0; 실패시 SOCKET_ERROR

Window Socket 관련 함수

: 리눅스 기반의 소켓 함수와 큰 차이가 없다.

: 소켓 핸들을 사용한다.

SOCKET WSAAPI socket( int af, int type, int protocol );
// 성공시 소켓 핸들, 실패시 INVALID_SOCKET
int bind( SOCKET s, const sockaddr *addr, int namelen );
// 성공시 소켓 핸들, 실패시 SOCKET_ERROR
int WSAAPI listen( SOCKET s, int backlog );
// 성공시 0, 실패시 SOCKET_ERROR
SOCKET WSAAPI accept( SOCKET s, sockaddr *addr, int *addrlen );
// 성공시 소켓 핸들, 실패시 INVAILD_SOCKET
int WSAAPI connect( SOCKET s, const sockaddr *name, int namelen );
// 성공시 0, 실패시 SOCKET_ERROR
int WSAAPI closesocket( SOCKET s );
// 성공시 0, 실패시 SOCKET_ERROR

Window 입출력 함수

: 리눅스 read/write, send/recv

: 윈도우   -  /   -   , send/recv

int send(
  SOCKET s,     // 소켓 핸들값
  char   *buf,  // 전달할 데이터 버퍼의 주소값
  int    len,   // 전달할 바이트 수
  int    flags  // 전달할때 옵션
);

// 성공시 수신 바이트 수, 실패시 SOCKET_ERROR
int recv(
  SOCKET s,     // 소켓 핸들값
  char   *buf,  // 전달받을 데이터 버퍼의 주소값
  int    len,   // 전달받을 바이트 수
  int    flags  // 전달받을때 옵션
);

// 성공시 수신 바이트 수, 실패시 SOCKET_ERROR