본문 바로가기

TCP/IP 소켓 프로그래밍

[WinSock] Hello World 소켓 프로그래밍

윈속을 이용하여 서버에서 클라이언트로 Hello World를 보내는 코드입니다.
//서버코드
#include<stdio.h>
#include<string.h>
#include<WinSock2.h>
void ErrorHandling(char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

void main()
{
	WSADATA wsaData;
	SOCKET serv_sock, clnt_sock;///

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	int clnt_addr_size;

	//클라이언트로 보낼 메세지
	char message[]="Hello World";

	//2.2버전 윈도우 소켓,
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
		ErrorHandling("WSAStartup() error!");

	//서버 소켓 생성    IPv4사용, 연결지향형(TCP)사용
	serv_sock = socket(PF_INET,SOCK_STREAM,0);
	if(serv_sock == -1)
		ErrorHandling("socket() error!");

	//서버 주소정보 초기화
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;//IPv4사용
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);//자동할당
	serv_addr.sin_port=htons(atoi("9190"));
	
	//소켓에 주소정보 할당
	if(bind(serv_sock,(SOCKADDR*)&serv_addr,sizeof(serv_addr))==SOCKET_ERROR)
		ErrorHandling("bind() error");
	
	//클라이언트로부터 연결요청을 대기
	if(listen(serv_sock,5)==SOCKET_ERROR)
		ErrorHandling("listen() error!");

	//연결 요청수락 수락시 클라이언트의 소켓정보가 생성된다.
	clnt_addr_size=sizeof(clnt_addr);
	clnt_sock=accept(serv_sock,(SOCKADDR*)&clnt_addr,&clnt_addr_size);
	if(clnt_sock==INVALID_SOCKET)
		ErrorHandling("accept() error!");

	//데이터를 클라이언트로 전송
	send(clnt_sock,message,sizeof(message),0);
	
	//소켓및 WSADATA닫기
	closesocket(clnt_sock);
	closesocket(serv_sock);
	WSACleanup();

}
//클라이언트 코드
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
void ErrorHandling(char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

void main()
{
	SOCKET sock;
	struct sockaddr_in serv_addr;
	char message[30];//서버로부터 메세지를 받을 공간
	int str_len;

	WSADATA wsaData;

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

	//소켓 생성
	sock=socket(PF_INET,SOCK_STREAM,0);
	if(sock == -1)
		ErrorHandling("socket() error");

	//주소 정보 초기화
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;//IPv4사용
	serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//루프백주소/
	serv_addr.sin_port = htons(atoi("9190"));

	//서버에 connect함수로 연결할시 자동으로 소켓에 주소정보를 할당하기때문에 bind함수를 호출할 필요가 없다.
	if(connect(sock,(SOCKADDR*)&serv_addr,sizeof(serv_addr))==SOCKET_ERROR)
		ErrorHandling("connect() error!");

	//서버에서 보낸 메세지 받기
	str_len=recv(sock,message,sizeof(message)-1,0);
	if(str_len==-1)
		ErrorHandling("recv() error!");

	//서버로부터 받은 메세지 출력
	printf("Message from server : %s \n",message);

	//소켓 닫기
	closesocket(sock);
	WSACleanup();
	
}
[출저]윤성우의 열혈 TCP/IP 프로그래밍