본문 바로가기

C/C++

Server 프로그램 기본소스 분석

네트워크는 전혀 안해보았는데

서버 , 클라이언트 프로그램을 만들던중 공부하면서 분석해본다.

주로 검색을 통해 하나하나 짚어본다.




ws2_32.lib 를  종속성에 추가해준다.




#define _WINSOCKAPI_

#include <windows.h>

#include <winsock2.h>



추가로

#include <iostream>

#include <vector>    

#include <ctype.h>



Winsock2에 정의된 구조체를 선언한다.


예) WSADATA wsa;



Socket 생성


SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);



serveradder 선언을 한다. 


SOCKADDR_IN serveraddr;


ZeroMemory(&serveraddr, sizeof(serveraddr)); //메모리를 0으로 채운다.

serveraddr.sin_family = AF_INET; //소켓주소체계를 정의한다.

serveraddr.sin_port = htons(5555); //포트번호

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); 



retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); //소켓에 주소할당

//retval 은 미리 선언해놓은 int형이며 if(retval == SOCKET_ERROR )처럼 에러를 리턴받는다.

listen(listen_sock, SOMAXCONN); // 연결요청 대기



Client 소켓 생성


SOCKET client_sock;

client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);





데이터 주고받는 부분


while(1)

{     

        retval = recv(client_sock, buf, BUFSIZE, 0);

 

       if(retval == SOCKET_ERROR)

        {    

                   err_display("recv()");

                      break;

        }

 

       else if(retval == 0)

                  break; 

 

          buf[retval] = '\0';

          printf("[%s:%d] %s\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buf);

          retval = send(client_sock, buf, retval, 0);

          if(retval == SOCKET_ERROR)

          {      

                err_display("send()");

                 break

          } 

}




소켓 릴리즈

closesocket(client_sock);

//리슨소켓종료

closesocket(listen_sock);

//윈속종료

WSACleanup();




UDP 서버,클라이언트 코드 참고

http://thdev.net/175



'C/C++' 카테고리의 다른 글

MFC 메모리릭 잡기  (0) 2012.12.09
(MEMO) 포인터와 변수참조  (0) 2011.09.02