TCP 네트워크 프로그래밍

1.TCP 프로그래밍 모델

  • tcp특징: 연결을 바탕으로 하는 통신, 즉 통신을 하려면 먼저 연결을 구축해야 한다.
  • 프로그래밍 모델
  • 서버
    클라이언트
    소켓 만들기
    소켓 만들기
    IP 주소 바인딩
    감청 포트
    연결 대기 중
    서버 연결
    데이터 수신/발송
    데이터 수신/발송
    연결 종료
    연결 종료
  • 세 번의 악수의 의미: 클라이언트 요청 연결, 서버 회신 연결, 연결 구축 클라이언트 전송 데이터.

  • 참고:

  • 귀속 주소는 서버 IP 주소와 포트를 한데 묶는 것이다. 즉, 이 서버는 이 고정된 포트로만 통신한다.(시스템에서 플러그인과 연결할 IP 주소를 선택)
  • 감청 포트는 귀속 IP를 감청하는 이 포트입니다.
  • 2. 관련 함수


    서버 측
  • 플러그인 함수 이름 만들기: socket 함수 원형: int socket (int domain, int type, int protocol) 함수 기능: 플러그인에 속하는 헤더 파일 만들기:sys/socket.h 반환값: 플러그인 설명자 반환, 실패 반환-1 매개 변수 설명:domain: 플러그인 통신 영역, type: 플러그인 형식,protocol: 소속 프로토콜
  • 귀속 주소 함수 이름:bind 함수 원형:intbind(intsockfd,conststructsockaddr*addr,socklenutlen) 함수 기능:관련 주소와 플러그인 소속 헤더 파일:sys/socket.h 반환값: 0 반환 성공, 실패 반환-1 매개 변수 설명: sockfd: 플러그인에 대한 설명자,addr 플러그인 구조의 주소,len: 플러그인의 길이
  • 참고:


    1. 소켓의 데이터 구조
    2. 문자형 IP 주소와 정형 IP 주소(네트워크 바이트 순서) 사이의 변환
  • in_addr_t inet_addr(constchar*cp) 기능: 문자열 형식의 IP 주소를 정수형 IP 주소(네트워크 바이트)로 변환합니다.예: in_addr.saddr = inet_addr(“192.168.1.1”);
  • char *inet_ntoa(struct in_addr) 기능: 정수 형식의 IP 주소를 문자 형식의 IP 주소로 변환합니다.

  • 3. 네트워크 바이트 및 호스트 바이트
  • 네트워크 바이트 순서: 네트워크를 통해 데이터를 보낼 때 소단 모드를 대단 모드로 전환해야 한다.본기가 수신할 때 대단위 모델을 원가기 모델로 전환해야 한다(본기가 대단위 모델이라면 전환할 필요가 없다)
  • 클라이언트 본체 바이트 순서: 대단이나 소단일 수 있습니다. 소단일 경우 발송 전에 대단으로 전환해야 합니다.
  • 네트워크 바이트 순서: 네트워크에서 전송되는 모델, 대단위 모델로 규정
  • 서버 본체 바이트 시퀀스: 대단이나 소단일 수도 있고, 소단일 때 수신해야 할 경우 (네트워크 바이트 시퀀스는 대단) 소단으로 전환해야 한다
  • 4. 호스트 바이트와 네트워크 바이트의 변환 함수
  • uint32_thtonl(uint32_thostlong) 기능: 32비트의 데이터를 호스트 바이트에서 네트워크 바이트로 변환하는 범례: in_addr.saddr = htonl(INADDR_ANY)
  • uint_t htons(unit16_t hostshort); 기능: 16비트 데이터를 호스트 바이트에서 네트워크 바이트로 변환하는 예: in_addr.saddr = htonl(INADDR_ANY)
  • uint32_thtonl(uint32_tnetlong) 기능: 32비트의 데이터를 네트워크 바이트에서 호스트 바이트로 변환
  • uint_t htons(unit16_t netlong); 기능: 16비트 데이터를 네트워크 바이트에서 호스트 바이트로 전환
  • 감청 포트 함수 설정 이름: listen 함수 원형: intlisten(intsockfd, intbacklog) 함수 기능: 연결 요청을 수신하거나 서버가 클라이언트 요청에 속하는 헤더 파일을 몇 개 연결할 수 있는지 알려줍니다:sys/socket.h 반환값: 0 반환 성공, 실패 반환-1 매개 변수 설명: sockfd: 플러그인 설명자,backlog: 클라이언트 수
  • 연결 대기 함수 이름: accept 함수 원형: int accept (int sockfd,struct sockaddr,socklenut *len) 함수 기능: 연결 요청을 받고 연결을 위한 헤더 파일:sys/socket.h반환값: 새 플러그인 설명자를 성공적으로 되돌려줍니다. (뒤에 보내는 것과 수신 데이터는 이 새 플러그인으로 편지할 것입니다.) 실패 반환-1 매개 변수 설명: sockfd: 플러그인 설명자,addr: 클라이언트 주소 (주의: 이 매개 변수는 값을 전달하는 것이 아니라 클라이언트의 주소를 받는 것입니다), len: 주소 길이의 주소
  • 주의: 이 함수는 서버의 막힘을 초래할 수 있습니다. 즉, 클라이언트 연결이 없을 때 서버가 계속 대기 상태입니다.
  • 전송 데이터 함수 이름:send 함수 원형:intsend(intsockfd,constvoid*buf,size_t nbytes,intflags) 함수 기능:전송 데이터 소속 헤더 파일:sys/socket.h 반환값: 전송된 바이트 수를 성공적으로 되돌려줍니다. 실패 반환-1 매개 변수 설명: sockfd: 플러그인 설명자,buf: 전송 바이트 캐시 주소, nbytes: 전송 바이트 수,flags:,
  • 수신 데이터 함수 이름:recv 함수 원형:ssize_trecv(intsockfd,void*buf,size_tnbytes,intflags) 함수 기능: 데이터 수신 헤드 파일:sys/socket.h 반환값: 바이트 길이를 성공적으로 되돌려줍니다. 사용 가능한 데이터가 없거나 등방이 순서대로 끝났을 때 0을 되돌려줍니다. 오류가 발생하면 -1 매개 변수 설명:send 매개 변수와 의미가 같습니다.
  • 연결 함수 닫기 이름:close 함수 원형:intclose(intfd) 함수 기능:파일 소속 헤더 파일 닫기:unistd.h 반환값: 0 반환, 실패 반환-1 매개 변수 설명: fd: 파일을 닫으려는 설명자
  • 클라이언트는 연결 서버를 제외하고는 함수가 다르고 다른 함수는 같다
  • 연결 서버 함수 이름:connect 함수 원형:intconnect(intsockfd,conststructsockaddr*addr,socklenutlen) 함수 기능:클라이언트와 서버의 연결을 만드는 헤더 파일:sys/socket.h 반환값: 0 반환 성공, 실패 반환-1 매개 변수 설명: sockfd: 플러그인 설명자,addr: 서버 주소,len: 주소 길이.

  • 3. 실례 프로그래밍


    TCP 통신 프로그램 설계: 서버와 클라이언트가 서로 발송하고 수신하는 기능을 실현한다.
  • 서버 프로그램
  • #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main()
    {
        int sockfd;
        int n_sockfd;
        int fd;
        ssize_t num;
        char sv_buf[128];
        char rv_buf[128];
        int sin_size;
        unsigned short int portnum = 5000;  
        struct sockaddr_in sockaddr_sv, sockaddr_ct;
    //1. 
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (-1 == sockfd)
        {
            printf("creat sockfd fail!
    "
    ); exit(1); } //2. IP sockaddr_sv.sin_family = AF_INET; sockaddr_sv.sin_port = htons(portnum); sockaddr_sv.sin_addr.s_addr = htonl(INADDR_ANY); bzero(&sockaddr_sv.sin_zero,8); if(-1 == bind(sockfd,(struct sockaddr *) &sockaddr_sv,sizeof(struct sockaddr))) { printf("bind port fail!
    "
    ); exit(1); } //3. if(-1 == listen(sockfd,5)) { printf("listen port fail!
    "
    ); exit(1); } //4. sin_size = sizeof(struct sockaddr); n_sockfd = accept(sockfd, (struct sockaddr *)&sockaddr_ct,&sin_size); printf("server get connection from %s
    "
    ,inet_ntoa(sockaddr_ct.sin_addr)); //5. / while (1) { fgets(sv_buf,128,stdin); send(n_sockfd, sv_buf, strlen(sv_buf), 0); fd = fork();// if (0 == fd) { while(1) { num = recv(n_sockfd, rv_buf, 128, 0); rv_buf[num] = '\0'; printf("%s",rv_buf); } } } //6. close(sockfd); }
  • 클라이언트 프로그램
  • #include <stdio.h>
    #include <strings.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main()
    {
        int fd; 
        int sockfd;
        int n_sockfd;
        ssize_t num = 0;
        char ct_buf[128];
        char st_buf[128];
        //int sin_size;
        unsigned short int portnum = 5000;
        struct sockaddr_in sockaddr_sv;
    //1. 
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (-1 == sockfd)
        {
            printf("creat sockfd is fail!");
        }
    //2. 
        sockaddr_sv.sin_family = AF_INET;
        sockaddr_sv.sin_port = htons(portnum);
        sockaddr_sv.sin_addr.s_addr = inet_addr("192.168.1.100");
        bzero(&sockaddr_sv.sin_zero,8);
        connect(sockfd,(struct sockaddr *)&sockaddr_sv,sizeof(struct sockaddr));
        while (1)
        {
            num = recv(sockfd, ct_buf, 128, 0);
            ct_buf[num] = '\0';
            printf("%s",ct_buf);
    
            fd = fork();// 
            if (0 == fd)
            {
                while(1)
                {
                    fgets(st_buf,128,stdin);
                    send(sockfd, st_buf, strlen(st_buf), 0);
                }
            }
        }   
    //3. 
        close(sockfd);
    }
    
    

    좋은 웹페이지 즐겨찾기