본문 바로가기
프로그래밍

윈도우 소켓 라이브러리 함수

by 건우아빠유리남편 2009. 10. 4.
반응형

필요 헤더 및 라이브러리 

#include <winsock2.h>

#pragma commnet(lib,"ws2_32")

 

윈속 초기화 - 응용에서 한 번만 설정(일반적으로 시작시)

int WSAStartup(WORD wVersionRequested,LPWSDATA lpWSAData);

 

예 

WSADATA wsadata;

WSAStartup(MAKEWORD(2,2),&wsadata);

윈속 해제화 - 더 이상 소켓 통신 사용하는 구문 없을 때(일반적으로 종료시)

int WSACleanup(void); 

 

 

소켓 생성

SOCKET socket(int af, int type, int protocol);

af : address family, pf: protocol family - 같은 값
    AF_INET - IPv4 (PF_INET)
    AF_INET6 - IPv6 (PF_INET6)

    AF_LOCAL - UNIX Local 통신 (PF_LOCAL)
    AF_PACKET - Low Socket (PF_PACKET)
    AF_IPX - IPX (PF_IPX)

type: 전송 타입

    SOCK_STREAM - 바이트 단위 통신

    SOCK_DGRAM  - 메시지 단위 통신

protocol:

    프로토콜 구분자

    AF_INET에서는 의미 없음

        SOCK_STREAM은 protocol이 tcp밖에 없고 , SOCK_DGRAM은 protocol이 udp밖에 없음

     

예 

SOCKET sock = socket(AF_INET,SOCK_STREAM,0);

 

소켓 해제

void closesocket(SOCKET s);

 

소켓과 네트워크 디바이스 연결

int bind(SOCKET s, SOCKADDR *sa,int namelen); 

SOCKADDR - 네트워크 디바이스와 연결할 소켓 주소(공용체 , Address Family에 따라 주소 체계 다름)

namelen - 주소 길이

 

예 

SOCKADDR_IN servaddr={0,};

saddr.sin_addr.s_addr = inet_addr("192.168.0.1");

saddr.sin_famliy = PF_INET;

saddr.sin_port = htons(1024);

bind(sock,(SOCKADDR *)&servaddr,sizeof(servaddr));

 

 

동시접속 최대 client 지정(SOCK_STREAM 소켓에서)

 int listen(SOCKET s,int n);

예 

listen(sock,5); 

 

 

client로부터 접속하기를 대기하고 연결을 수락

SOCKET accept(SOCKET s,SOCKADDR *sa,int *paddrlen);

반환: 접속한 client와 주고 받는 작업을 할 doit소켓 

첫번째 인수: listen socket

두번째 인수: 접속 수락되면 접속한 client 주소가 채워진다.

세번째 인수: address구조체 사이즈

SOCKADDR_IN clientaddr;

int len = sizeof(clientaddr);

SOCKET dosock;

dosock = accept(sock,(SOCKADDR *)&clientaddr,&len); 

 

 

연결 요청

 int connect(SOCKET s, SOCKADDR *sa, int addrlen); 

SOCKADDR_IN servaddr={0,};

saddr.sin_addr.s_addr = inet_addr("192.168.0.1");//서버측 IP주소

saddr.sin_famliy = PF_INET;

saddr.sin_port = htons(1024);

connect(sock,(SOCKADDR*)&servaddr,sizeof(servaddr)); 

  

출력 함수

int send(SOCKET s, const char  *buf, int len, int flags);

두번째 인자: 보낼 데이터 버퍼

int len : 보낼 데이터의 크기

int flags : 옵션

send(sock,pack,plen,0); 

int sendto(SOCKET s,const char *buf,int len,int flags,SOCKADDR *addr,int addrlen);

수신자주소와 길이를 추가하면 된다. 

 

 

입력 함수

int recv(SOCKET s, const char  *buf, int len, int flags);

두번째 인자: 받을 데이터 버퍼

int len : 받을 데이터의 크기

int flags : 옵션

recv(sock,pack,plen,0); 

 

입력함수2 - UDP에서

int recvfrom(SOCKET s,const char *buf,int len,int flags,SOCKADDR *addr,int *paddrlen);

송신자주소와 길이를 추가하면 된다.

송신자 주소가 0으로 되어 있으면 모든 송신자를 의미함 


반응형

'프로그래밍' 카테고리의 다른 글

아스키코드표  (0) 2009.11.04
Stack 동적알고리즘 연습  (0) 2009.10.12
동적알고리즘(동적계획법) 예제와 설명  (0) 2009.09.23
Socket 모델들의 용어 정리2  (0) 2009.09.23
Socket 모델들의 정의 정리  (0) 2009.09.23

댓글