윈속을 위한 헤더 및 라이브러리 설정


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);

}


+ Recent posts