본문 바로가기

소켓 통신 프로그래밍

내부적으로 Socket 표준을 기반으로 조금 더 편리하게 사용하도록 발전된 형태의 라이브러리들에 불과하다.

  API / 클래스 설명 제공 기능 OS/PL
Unix Socket API 네트워크 표준 API Low Level 의 소켓 프로그래밍

TCP, UDP 등 다양한 네트워크에 사용
Unix(+ Ubuntu, Redhat..)
Window WinSock2 API Socket API 윈도우 버전 Window(C/C++)
C#
.NET
Sockets WinSock2 API C# 버전 Sockets 닷넷은 WinSock2 API 호출 Window(C#)
TcpClient 내부적으로
Sockets 클래스 사용
TCP, UDP 전용
TcpListner
UdpClient

 

윈도우 소켓 실행 흐름

WSA(WinSock API)

윈속 프로그래밍을 할 때는 반드시, WSAStartup( ) 함수를 호출해서 프로그램에서 사용하려는 윈도우 소켓의 버전을 명시하고, 해당 버전을 지원하는 라이브러리를 초기화 해야 한다.

WSAStartup( )

윈도우 소켓은 몇몇 버전이 존재하기에 반드시 프로그램에서 요구하는 winsock 버전을 명시해야 한다.

하고, 라이브러리 초기화를 진행해야 한다.

#include <winsock2.h>

int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);

// 성공시 0, 실패시 0이 아닌 에러코드
// wVersionRequired : 윈속 버전 정보 명시하여 전달
// lpWSAData        : WSADATA 구조체 변수 포인터, 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

 

BasicLike

어? 나 프로그래밍 좋아하네?