'SOCKET'에 해당되는 글 1건

  1. 2013.02.11 소켓 프로그램 기본 구조 - Server - by 똘이 임덕규

서버 프로그램

네트워크 연결 장치인 소켓을 생성하여 포트를 할당하고, 해당 포트로 클라이언트로부터의 연결 요청이 들어오면 즉시 연결, 준비된 문자열인 "Hello World"를 클라이언트측에 전송하도록 구현.



#include <stdio.h>     
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 9000               /* 포트를 9000번으로 명시 */

char buffer[BUFSIZ] = "hello, world\n"; /* 보낼 문자열 */

int main()
{
    int c_socket;
    int s_socket;

    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;

    int len;
    int n;

    /* 클라이언트로 부터 연결 요청을 받을 수 있도록 Socket 함수를 이용,
     * 네트워크 연결 장치인 소켓을 생성한다.*/
    s_socket = socket(PF_INET, SOCK_STREAM, 0);

    /* 클라이언트로 부터 연결 요청을 받을 서버 IP주소와 포트를 설정
     * 9000번 포트로 들어오는 모든 연결 요청에 대해 응용프로그램에서 처리하겠다는 의미 */
    memset(&s_addr, 0, sizeof(s_addr));
    s_addr.sin_addr.s_addr =    htonl(INADDR_ANY);
    s_addr.sin_family =         AF_INET;
    s_addr.sin_port =           htons(PORT);

    /* 생성한 소켓을 해당 포트와 연결 */
    if(bind(s_socket, (struct sockaddr *) &s_addr, sizeof(s_addr)) == -1)
    {
        printf("Can not Bind\n");
        return -1;
    }

    /* 커널에 해당 소켓으로 통신이 이루어지도록 요청
     * 이 시점 이후로 해당 포트로 요청하는 연결을 받아들인다.*/
    if(listen(s_socket, 5) == -1)
    {
        printf("listen Fail\n");
        return -1;
    }

    /* 무한 루프 */
    while(1)
    {
        /* 클라이언트로 부터 연결 요청을 받아 들이는 코드
         * 전화 오기를 기다리다가 비로서 수화기를 들어 받는 단계 */
        len = sizeof(c_addr);
        c_socket = accept(s_socket, (struct sockaddr *) &c_addr, &len);
        
        /* 클라이언트와 연결된 연결 소켓(c_socket)으로 문자열 hello world를
         * 보낸다. */
        n = strlen(buffer);
        write(c_socket, buffer, n);

        /* 클라이언트에 연결된 연결 소켓(c_socket)을 끊고, 클라이언트로 부터 새로운
         * 연결 요청이 오기를 듣기 소켓(s_socket)을 이용하여 기다린다.*/
        close(c_socket);
    }
    close(c_socket);
        
    return 0;
}

사용된 주요 함수

  • 소켓을 생성
    • socket()
  • 연결 요청을 수신할 주소 설정
  • 소켓을 포트에 연결
    • blind()
  • 커널에 개통을 요청
    • listen()
  • 연결 요청을 수신
    • accept()
  • 클라이언트에게 서비스를 제공
    • read() / write()
  • 클라이언트와의 연결을 종료
    • close()

서버 프로그램만으로는 어떠한 결과 화면도 볼 순 없다. 다만 프로그램 자체는 정상적으로 소켓을 만들고 설정한 뒤 무한루프 안의 accept() 함수가 클라이언트의 연결 요청을 기다리고 있다.

아직 클라이언트 프로그램을 만들지 않았기 때문에 Telnet을 이용하여 간단하게 확인해 보았다. 서버가 잘 동작하는 것을 확인할 수 있다.

저작자 표시
신고