윈속을 위한 헤더 및 라이브러리 설정
winsock2.h 헤더 파일을 포함 한다.
ws2_32.lib 라이브러리를 링크 시킨다.
윈속 사용을 위한 라이브러리 초기화 및 해제
윈속 관련 라이브러리 초기화 함수
#include<winsock2.h>
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
WORD wVersionRequested 에 버전에 맞는 16진수를 전달해야한다.
예 Version 3.4 이면 0x0403 식으로 주버전이 뒤로간다.
※
WORD MAKEWORD(BYTE bLow,BYTE bHigh);
bLow에 주 버전 bHigh 에 부 버전을 넣으면 16진수로 반환된다.
윈속 관련 라이브러리 해제 함수
int WSACleanup(void);
윈속 프로그램 코드 Template
#include<winsock2.h>
............
int main(int argc, char **argv)
{
WSADATA wsaData;
...............
if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
error_handling("WSAStartup() error!");
..................
WSACleanup()
retune 0;
}
윈속 기반의 소켓 관련 함수
SOCKET socket(int af, int type ,int protocol);
윈도우에서도 socket을 생성하면 리눅스와 마찬가지로 파일(소켓)핸들이 만들어져서 리턴된다.
※파일(소켓) 핸들도 정수형 데이터이다.
int bind(SOCKET s,const struct sockaddr FAR * name, int namelen);
int listen(SOCKET s, int backlog);
SOCKET accept(SOCKET s, struct sockaddr FAR *addr,int FAR *addrlen);
int connect(SOCKET s, const sockaddr FAR * name, int namelen);
윈속 기반의 데이터 입출력 함수
데이터 출력함수
#include<winsock2.h>
int send(SOCKET s, const char FAR *buf, int len, int flags);
데이터 입력함수
#include<winsock2,h>
int recv(SOCKET s, char FAR *buf, int len, int flags);
send,recv 함수는 리눅스에도 존재하는 함수로 윈도우에서는 리눅스의 read,write함수가 없기에 send,recv함수를 사용한다.
예제
서버
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h>
void ErrorHandling(char *message);
int main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET hServSock;
SOCKET hClntSock;
SOCKADDR_IN servAddr;
SOCKADDR_IN clntAddr;
int szClntAddr;
char message[]="hello World\n";
if(argc!=2){
printf("Usage : %s <port>\n",argv[0]);
}
if(WSAStartup(MAKEWORD(2,2), &wsaData) !=0)
ErrorHandling("WSAStartup() error!");
hServSock=socket(PF_INET, SOCK_STREAM, 0); //서버 소켓 생성
if(hServSock==INVALID_SOCKET)
ErrorHandling("socket() error");
memset(&servAddr, 0 ,sizeof(servAddr));
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
servAddr.sin_port=htons(atoi(argv[1]));
if(bind(hServSock, (SOCKADDR*) &servAddr,sizeof(servAddr))==SOCKET_ERROR)
ErrorHandling("bind() error");
if(listen(hServSock,5)==SOCKET_ERROR)
ErrorHandling("listen() error"); //연결 요청 대기
szClntAddr=sizeof(clntAddr);
hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr); //연결요청수락
if(hClntSock==INVALID_SOCKET)
ErrorHandling("accept() error");
send(hClntSock, message, sizof(message), 0);
closesocket(hClntSock);
WASCleanup();
클라이언트
#include<stdio,h>
#include<stdlib.h>
#incldue<string.h>
#incldue<winsock2.h>
void ErrorHandling(char *message);
int main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET hSocket;
char message[30];
int strLen;
SOCKADDR_IN servAddr;
if(argc!=3){
printf("Usage : %s <IP> <port> \n",argv[0]);
exit(1);
}
if(WSAStartup(MAKEWORD(2,2), &wsadata) !=0)
ErrorHandling(WSAStartup() error!");
hSocket=socket(PF_INET, SOCK_STREAM, 0);
if(hSocket==INVALID_SOCKET)
ErrorHandling("hSocketet() error");
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family=AF_INET;
servAddr.sin_addr,s_addr=inet_addr(argv[1]);
servaddr.sin_port=htons(atoi(argv[2]));
if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR)
Erroerhandling(:connect() error!);
strLen=recv(hSocket, message, sizeof(message)-1,0);
if(strLen==-1)
ErrorHandling("read() error!");
message[strLen]=0;
printf("Message from server : %s \n", message);
closesocket(hSocket);
WSACleanup();
return 0;
}
void ErrorHandling(char *message)
{
fputs(message, stderr);
fputc('\n',stderr);
exit(1);
}
'강좌 정리 > TCP IP 소켓 프로그래밍' 카테고리의 다른 글
제1장 네트워크 프로그래밍과 소켓의 이해 ③파일의 조작 (0) | 2012.07.20 |
---|---|
제1장 네트워크 프로그래밍과 소켓의 이해 ②네트워크 프로그래밍의 이해2 (0) | 2012.07.18 |
01장. 네트워크 프로그래밍과 소켓의 이해 ①네트워크 프로그래밍의 이해 (0) | 2012.07.11 |