윈도우 소켓

|

윈도우 소켓


윈속 초기화

#include <winsock2.h>
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
->성공시 0, 실패 시 0이 아닌 에러코드 값 반환
-> wVersionRequested 프로그래머가 사용할 윈속의 버전정보 전달
-> lpWSAData WSADATA라는 구조체 변수의 주소 값 전달.

->윈속 기반 프로그래밍에서는 공식과 같이 등장
 
int main(int argc, char * argv[])
{
WSDATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling(“WSAStartup() error!”);
...

return 0;
}
상위 8비트는 부버전, 하위 8비트는 주버전

MAKEWORD(1, 2) -> 주버전 1, 부버전 2 , 0x0201반환 ->2진수 16진수 513
MAKEWORD(2, 2) -> 주버전 2, 부버전 2, 0x0202 반환



윈속 라이브러리 해제
#include <winsock2.h>
int WSACleanup(void);
->성공시 0, 실패 시 SOCKET_ERROR 반환

프로그램이 종료되기 직전에 호출하는 것이 보통임

윈도우 소켓 관련 함수

#include <winsock2.h>
SOCKET socket(int af, int type, int protocol);
->성공시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

#include <winsock2.h>
int bind(SOCKET s, const sturct sockaddr * name, int namelen);
->성공시 소켓 핸들, 실패 시 SOCKET_ERROR 반환

#include <winsock2.h>
int listen(SOCKET s, int backlog);
->성공 시 0, 실패 시 SOCKET_ERROR 반환

#include <winsock2.h>
SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);
->성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

#include <winsock2.h>
int connect(SOCKET s, const struct sockaddr * name, int namelen);
->성공 시 0, 실패 시 SOCKET_ERROR 반환

소켓을 닫을때
#include <winsock2.h>
int close socket(SOCKET s);
->성공 시 0, 실패 시 SOCKET_ERROR 반환

//입출력함수

#include <winsock2.h>
int send(SOCKET s, const char * buf, int len, int flags);
->성공 시 전송된 바이트 수, 실패 시 SOCKET_ERROR 반환

s-> 데이터 전송 대상과의 연결을 의미하는 소켓의 핸들 값 전달
buf-> 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달.
len -> 전송할 바이트 수 전달
flags -> 데이터 전송 시 적용할 다양한 옵션 정보 전달.


//입출력함수
#include <winsock2.h>
int recv(SOCKET s, const char * buf, int len, int flags);
->성공 시 수신한 바이트 수(단 EOF 전송 시 0), 실패 시 SOCKET_ERROR 반환

s-> 데이터 수신 대상과의 연결을 의미하는 소켓의 핸들 값 전달
buf-> 수신된 데이터를 저장할 버퍼의 주소 값 전달.
len -> 수신할 수 있는 바이트 수 전달
flags -> 데이터 수신 시 적용할 다양한 옵션 정보 전달.





예제소스

서버

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

void ErrorHandling(char * message);

int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;

int szClntAddr;
char message[] = "Hello World!";
if(argc!=2)
{
printf("Usage : %s <port> \n", argv[0]);
exit(1);
}

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, sizeof(message), 0);
closesocket(hClntSock);
closesocket(hServSock);
WSACleanup();
return 0;
}
void ErrorHandling(char * message)
{
fputs(message,stderr);
fputc('\n', stderr);
exit(1);
}



클라이언트


#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void ErrorHandling(char * message);

int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET hSocket;
SOCKADDR_IN servAddr;

char message[30];
int strLen;
if(argc != 3)
{
printf("Usage : %s <IP> <port>\n",argv[0]);
exit(0);
}

if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{
ErrorHandling("WSAStartup() error!");
}

hSocket = socket(PF_INET, SOCK_STREAM, 0);
if(hSocket == INVALID_SOCKET)
{
ErrorHandling("socket() error!");
}

memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(argv[1]); //ip
servAddr.sin_port = htons(atoi(argv[2])); //port

if(connect(hSocket, (SOCKADDR *)&servAddr,sizeof(servAddr)) == SOCKET_ERROR)
{
ErrorHandling("connect() error!");
}

strLen=recv(hSocket,message,sizeof(message)-1, 0);
if(strLen == 1)
ErrorHandling("read() error!");
printf("Message from server : %s \n", message);
closesocket(hSocket);
WSACleanup();

return 0;
}

void ErrorHandling(char * message)
{
fputs(message,stderr);
fputc('\n', stderr);
exit(1);
}





'웹관련' 카테고리의 다른 글

br 태그.  (0) 2014.12.23
주소체계와 데이터 정렬  (0) 2013.12.31
프로토콜  (0) 2013.12.31
윈도우 소켓  (0) 2013.12.31
소켓  (0) 2013.12.31
Trackback 0 And Comment 0
prev | 1 | ··· | 7 | 8 | 9 | 10 | 11 | 12 | 13 | next