본문 바로가기
코스웨어/15년 스마트컨트롤러

20151130 김태현 업무일지 Winsock #1

by 알 수 없는 사용자 2015. 12. 1.
728x90
반응형

윈도우가 유닉스의 영향을 받았기 때문에 똑같이 windowssocket을 채택했다.

winsock.h를 땡겨온다.

 

윈도우는 소켓을 사용할려면 반드시 불러야하는 함수가 있다.

 

if(WSAStartup(MAKEWORD(2,2),&wsaData)!= 0)

{

printf("error\r\n");

return 0;

}

와 끝에 WSACleanup(); 가 반드시 들어가야한다.

 

int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);

WSAStartup의 함수 원형을 보면 첫 번째 인자는 winsock의 버전을 적어주는 곳이다.



server.c

#include <stdio.h>

#include <winsock.h>


#pragma comment(lib, "Ws2_32.lib")


#define PORT 7777

#define IP "192.168.0.123"

#define MAX_PACKETLEN 512

int main()

{

WSADATA wsaData;

//서버용 소켓

SOCKET sSock;

//클라이언트용 소켓

SOCKET cSock;

//주소를 저장할 구조체

SOCKADDR_IN sAddr;

int iLen;

int Status;

int Writen;

char cBuf[MAX_PACKETLEN]; 

//윈속을 사용하겠다고 전달

if(WSAStartup(MAKEWORD(2,2),&wsaData)!= 0) 

printf("error\r\n"); 

return 0; 

}

//소켓 생성

sSock = socket(AF_INET, SOCK_STREAM, 0);

if(sSock == INVALID_SOCKET)

{

WSACleanup();

return 1;

}

//구조체를 사용하기 전에 쓰레기 값을 제거해준다.

memset(&sAddr,0,sizeof(SOCKADDR_IN));


sAddr.sin_family = AF_INET;

sAddr.sin_port = htons(PORT);

sAddr.sin_addr.S_un.S_addr = inet_addr(IP);

//구조체에 서버의 정보를 넣어준다

Status = bind(sSock,(struct sockaddr *)&sAddr, sizeof(SOCKADDR_IN));

if(Status == SOCKET_ERROR)

{

printf("Bind Error\n");

closesocket(sSock); 

WSACleanup();

return 0;

}

if( SOCKET_ERROR == listen(sSock, 5 )) 

printf("listen Error\n");

closesocket(sSock); 

WSACleanup();

return 0; 

}

while(1)

{

//구조체는 Bind시키고 나면 필요없어지기 때문에 재활용 해준다.

memset(&sAddr,0,sizeof(SOCKADDR_IN));

iLen = sizeof(SOCKADDR_IN);

//클라이언트가 접속하면 클라이언트의 정보가 구조체에 저장된다

cSock = accept(sSock, (struct sockaddr *)&sAddr, &iLen);

if(cSock == INVALID_SOCKET) 

printf("Accept Error\n"); 

closesocket(sSock); 

WSACleanup(); 

return 1; 

}

printf("Incomming client [%s] [%d]\n", inet_ntoa(sAddr.sin_addr), ntohs(sAddr.sin_port));

iLen = recv(cSock,cBuf, MAX_PACKETLEN,0);

if( iLen > 0)

{

Writen = send(cSock, cBuf, iLen,0);

}

else

{

printf("read Error\n");

}

closesocket(cSock);

if(0 ==strcmp(cBuf,"quit"))

{

break;

}

}

//소켓을 생성했으니 닫아줍시다.

closesocket(sSock);

WSACleanup();

return 0;


728x90