필요 헤더 및 라이브러리
#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 |
댓글