티스토리 뷰

반응형

한양대 이석복 교수님의 커리큘럼에 따라 중간고사 시기에 맞추어 중간 과제를 수행하여 포스트한다.
중간고사 까지의 내용 정리 포스트는 이전에 업로드된 포스트들로 대체하며 별도의 추가 포스트는 하지 않음.

Layer : App (2주) - Transport (3주) 중간고사 - Network - Link - Physical ...
출처: https://ingyeoking13.tistory.com/266 [welcome!]

````

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <signal.h>
#define PORT 3003
#define BACKLOG 10 /* how many pending connection queue will hold */

void cleanExit(int o){ exit(0); };

int main()
{
    signal(SIGTERM, cleanExit);
    signal(SIGINT, cleanExit);
    int sockfd, newfd; /* listen on sockfd, new connection on newfd */

    struct sockaddr_in serverAddr; /* my addr */
    struct sockaddr_in clientAddr; /* client addr */

    // socket()
    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0))== -1)
    {
        perror("socket");
        exit(1);
    }

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    /* INADDR_ANY allows clients to connect to any one of the host's IP address */
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); 

    // bind()
    if (bind(sockfd, (struct  sockaddr *)&serverAddr, sizeof(struct sockaddr)) == -1)
    {
        perror("bind");
        exit(1);
    };

    if (listen(sockfd, BACKLOG) == -1)
    {
        perror("listen");
        exit(1);
    }

    while(1)
    {
        socklen_t sz = sizeof(struct sockaddr_in);
        if ((newfd = accept(sockfd, (struct sockaddr*)&clientAddr, &sz)) ==-1)
        {
            perror("accept");
            continue;
        }
        printf("server: got connection from %s\n", inet_ntoa(clientAddr.sin_addr));
        const char *header =  "HTTP/1.0 200 OK\r\n\r\nHELLO";
        char readbuf[10000];
        int n;
        while((n=read(newfd, readbuf, sizeof(readbuf))) > 0)
        {
            printf("reading.... : %d\n", n);
            if (readbuf[n-1]=='\n') break;
            memset(readbuf, 0, sizeof(readbuf));
        };
        printf("server: got read from %s\n", inet_ntoa(clientAddr.sin_addr));
        printf("data:%s\n", readbuf);

        write(newfd, header, strlen(header));
        close(newfd);
        printf("closed\n");
    }

}
반응형

'네트워크' 카테고리의 다른 글

인강) 네트워크 계층  (0) 2021.08.17
HTTP 정리  (0) 2021.06.17
인강 ) 전송계층(3) - TCP(2)  (0) 2021.05.05
인강 ) 전송계층(2) - TCP  (0) 2021.05.04
인강 2) 애플리케이션 계층(완), 전송 계층(1)  (0) 2021.04.17