2010년 2월 4일 목요일

소켓 프로그래밍의 기초(2)

아래 내용들은 윤성우 저자의 "지피지기 TCP/IP소켓 프로그래밍" 책의 내용을 바탕으로 본인이 읽고 새로 정리한 내용들이니,
다소의 오류가 있을 수도 있습니다.


서버 소켓 기본 코드
[code cpp]
/*
* helloWorld_server.c
* Written by SW.YOON
* Edited by Michael YOON
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define default_PT 89123

void error_handling(char *message);

int main(int argc, char ** argv)
{
    int serv_sock;
    int clnt_sock;
    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    int clnt_addr_size;
    char message[]="Hello World!\n";

    if(argc>1)
    {
        printf("Usage : %s <port>\n" ,argv[0]);    //사용법
        printf("Default port is 89123\n");
    }
////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////기본 소켓 생성 설정/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
    serv_sock=socket(PF_INET, SOCK_STREAM,0);    //서버소켓 만들기
                                //PF_INET은

    if(serv_sock == -1)
        error_handling("socket() error");        //서버소켓 만들기 실패 시

    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(argc==2)
    {
        serv_addr.sin_port = htons( atoi(argv[1]) );
    }
    else
    {
        serv_addr.sin_port = htons( atoi(default_PT) );
    }

    if( bind( serv_sock, (struct sockaddr* )&serv_addr, sizeof(serv_addr) ) == -1 )
    {
        error_handling("bind() error");
    }

    if( listen(serv_sock,5) == -1 )
    {
        error_handling("listen() error");
    }
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
    clnt_addr_size = sizeof(clnt_addr);
    clnt_sock=accept( serv_sock, (struct sockaddr*) &clnt_addr, &clnt_addr_size );
                                /* 연결 수락 */
    if(clnt_sock == -1)
        error_handling("accept() error");    write( clnt_sock, message, sizeof(message) );        /* 데이터 전송 */
    close(clnt_sock);                        /* 연결 종료 */
    return 0;
}

void error_handling(char *message)
{
    fputs( message, stderr );
    fputc( '\n', stderr);
    exit(1);
}

[/code]

기본 연결포트는 89123포트로 설정해 놓았습니다.

우선 하나하나 코드를 살펴보면


17줄. 에러 핸들러를 선언합니다.


21줄. 서버소켓을 선언합니다.


22줄. 클라이언트 소켓을 선언합니다.


23줄. 서버의 IPv4주소체계를 기록하는 구조체이다.


24줄. 클라이언트의 IPv4주소체계를 기록하는 구조체이다.


25줄. 클라이언트 IPv4 주소 구조체의 크기를 기록하는 구조체이다.


26줄. 간단히 Hello World! 문자열을 출력하기 위한 문자배열이다.


28~32줄. 인자의 개수를 파악하여 사용법을 알려주기도 한다.


36줄. 서버소켓을 생성한다.


42~52줄에서는 서버주소체계를 설정하고 있다.


54줄. bind함수로 소켓과 인터넷 주소를 이어준다..


59줄, listen함수.




66줄.




67줄. accept함수!!



69~70줄. 여기는 간단히 에러처리 부분이다.




71. 여기서는 write 함수를 이용, message를 전송한다.


72줄. 클라이언트 소켓을 닫는다

댓글 없음:

댓글 쓰기