/************************************************************************
helloworld_server_win.c
Written by SW.YOON
참고 : TCP/IP 소켓 프로그래밍 / 윤성우 | 저
- 컴파일전 반드시 WS2_32.lib 라이브러리를 링크시켜야 한다.
- argument값으로 <포트번호> 가 필요하다.
************************************************************************/
#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]);
exit(1);
}
// Load Winsock 2.2 DLL
if(WSAStartup(MAKEWORD(2,2) , &wsaData) != 0)
ErrorHandling("WSAStartup() error!");
//서버 소켓 생성
hServSock = socket(PF_INET , SOCK_STREAM , 0);
if(hServSock == INVALID_SOCKET)
ErrorHandling("socket() error!");
//sockaddr_in 구조체
memset(&servAddr , 0 , sizeof(servAddr));
servAddr.sin_family = AF_INET; //주소체계(address_family)
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //32bit IPv4 주소
servAddr.sin_port = htons(atoi(argv[1])); //16bit TCP/UDP port
//servAddr.sin_zero 는 특별한 의미없는 단순한 채워주기(padding)위한 멤버
//소켓에 주소 할당
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);
WSACleanup(hClntSock);
return 0;
}
void ErrorHandling(char *message)
{
fputs(message , stderr);
fputc('\n' , stderr);
exit(1);
}