TCP/IP 소켓 프로그래밍
[WinSock] Hello World 소켓 프로그래밍
Cocororo
2011. 2. 25. 12:12
윈속을 이용하여 서버에서 클라이언트로 Hello World를 보내는 코드입니다.
[출저]윤성우의 열혈 TCP/IP 프로그래밍
//서버코드 #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(); }