Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
아, 소켓프로그래밍 모르겠는데 ! 소켓 프로그래밍의 시작
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2012. 10. 9. 01:10 ) | 신고

 

 

최근에 리버싱만해서 피폐해진 머리를 소켓 프로그래밍으로 옮겨서 연구 시작 !

 

프로그래밍 공부는 하고 싶은데, 책은 사기 싫고 . . . 그럴땐 역시 사랑스러운 MSDN 쨔응 !

 

 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms738545(v=vs.85).aspx

 

자, 이렇게하면 된다. 외국어영역 5등급정도만 나와도 충분히 이해할 수 있는 글뿐(?)이다.

 

차근 차근 읽어보면

 

소켓 프로그래밍의 통신에는 크게 두가지로 분류되는 듯하고 내부 절차는 이러한듯 하다.

 

 Server

 Client

 

1. Initialize Winsock.

2. Create a socket.

3. Bind the socket.

4. Listen on the socket for a client.

5. Accept a connection from a client.

6. Receive and send data.

7. Disconnect.

 

 

1. Initialize Winsock.

2. Create a socket.

3. Connect to the server.

4. Send and receive data.

5. Disconnect.

 

너무 쉽죠 ?

 

자, 이제 서버와 클라이언트의 소스를 작성해보자.

 

 

위 홈페이지를 들어가면 Client 와 Server 를 구축하는 간단한 예제 소스가 나와있다.

 

Server 부터 구축해야 Client를 시험해볼 수 있기 때문에 Server -> Client 순으로 구축하는걸 추천한다.

 

 

 

Server.cpp 

 #include <Winsock2.h>
 #include <windows.h>
 #include <stdio.h>

 

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

 

 int main(void){
    SOCKET           s;
    WSADATA         wsa;
    SOCKADDR_IN   addr;
    hostent             *host;
    char                *lpIPString;

 

    // WSA 초기화
    memset(&wsa,0,sizeof(wsa));
    if ( WSAStartup(MAKEWORD(2,2),&wsa) )
        return 0;

 

    // 소켓 생성
    s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

 

    // 현재 컴퓨터의 IP 정보를 얻어옴
    host = gethostbyname(NULL);
    lpIPString = inet_ntoa( **((in_addr **)host->h_addr_list) );

 

   // 소켓 주소 생성
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET; // type (IPv4)
    addr.sin_addr.s_addr = inet_addr(lpIPString); // ip
    addr.sin_port = htons(8181); // port

 

    // 소켓 주소 생성
    bind(s,(SOCKADDR *)&addr, sizeof(addr));

    {
        SOCKET   apt_s;
        int            nRecv;
        char         cBuffer[4096];
        char        *lptString = "Success SEND!! - Server\n";
        int            cnt = 0;

 

        // socket 및 bind 확인.

        listen(s,SOMAXCONN);
        memset(&apt_s,0,sizeof(apt_s));

        while ( cnt < 2 ){
            // connec t가 올 때까지 대기
            apt_s = accept(s,NULL,NULL);

            do{
                // send 가 올때까지 대기
                memset(cBuffer,0,4096);
                nRecv = recv(apt_s,cBuffer,4096,0);
                if ( nRecv == 0xFFFFFFFF )
                    break;
                if ( nRecv ){
                    send(apt_s,lptString,lstrlenA(lptString),0);
                    printf("%s",cBuffer);
                }
            }while(nRecv);
            closesocket(apt_s);
            cnt++;
        }
    }

    closesocket(s);

 

    WSACleanup();

 

    return 0;
 }

 

 

 

 Client.cpp 

 #include <Winsock2.h>
 #include <Ws2tcpip.h>
 #include <windows.h>
 #include <stdio.h>

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

 

 int main(void){
    SOCKET        s;
    WSADATA     wsa;
    ADDRINFOA   addr;
    ADDRINFOA   *paddr;
    hostent         *host;
    char             *lpIPString;
    char             *lpPort = "8181";

 

    memset(&wsa,0,sizeof(wsa));
    if ( WSAStartup(MAKEWORD(2,2),&wsa) )
        return 0;

 

    memset(&addr,0,sizeof(addr));
    addr.ai_family = AF_INET;
    addr.ai_socktype = SOCK_STREAM;
    addr.ai_protocol = IPPROTO_TCP;

    host = gethostbyname(NULL);
    lpIPString = inet_ntoa( **((in_addr **)host->h_addr_list) );

    getaddrinfo(lpIPString,lpPort,&addr,&paddr);

 

    s = socket(paddr->ai_family,paddr->ai_socktype,paddr->ai_protocol);

 

    connect(s,paddr->ai_addr,paddr->ai_addrlen);

    {
        SOCKET  apt_s;
        int   nSend;
        int   nRecv;
        char  cBuffer[4096];
        char  *lptString = "Success RECV!! - Client\n";

 

        do{
            nSend = send(s,lptString,lstrlenA(lptString),0);
            if ( nSend == 0xFFFFFFFF )
                break;
            memset(cBuffer,0,4096);
            nRecv = recv(s,cBuffer,4096,0);
            printf("%s",cBuffer);
            Sleep(1000);
        }while(nRecv);
    }

 

    shutdown(s, SD_SEND);

 

    closesocket(s);

 

    WSACleanup();

 

    return 0;
}

 

이런식으로 구축되지 않는가 !?

 

자, 그럼 이쯤에서 남자라면 한번씩 해보는 도전 !

 

 

 

인터넷을 접속하면 어떻게 될까 ?

 

 

 

조짐이 있어보인다 !

 

서버에서 다중연결을 원할 경우엔 accept 부터 thread 를 이용하여 적당히 뿌려주면 될 것같다 > < !!

 

조금 더 연구해서 한번 서버구축도 노려볼만할거 같음 ' ')b

( 인터넷 계층도 알아볼 필요가 있어보임 )

 

 

 

Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today :
Yesterday :