윈도우 소켓
윈속 초기화
#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);
}
Trackback 0 And
Comment 0


