#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <sys/socket.h>
#include <arpa/inet.h>


void error_handling(char *msg)
{
    fputs(msg, stderr);
    fputc('\n', stderr);
    terminated();
}

int main()
{
    int serv_sock;
    int clnt_sock;
    char lsBuf[128] = {0,};

    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    socklen_t clnt_addr_size;


    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    giSock_Serv = serv_sock;
    if(serv_sock < 0)
        error_handling("socket error");

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family        = AF_INET;
    serv_addr.sin_addr.s_addr   = inet_addr(gsIpLocal);  // 따로 받아옴
    serv_addr.sin_port          = htons(giPort);         // 따로 받아옴
   
    if ((setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&liOn, sizeof(liOn))) == -1)
        error_handling("SO_REUSEADDR error");

    if( bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0 )
        error_handling("bind error");

    if( listen(serv_sock, 5) < 0 )
        error_handling("listen error");

    clnt_addr_size = sizeof(clnt_addr);
    clnt_sock = accept( serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
    giSock_Clnt = clnt_sock;
    if( clnt_sock < 0 )
        error_handling("accept error");

    memset(lsBuf, 0x00, sizeof(lsBuf));
    sprintf(lsBuf, "Server Reply!! \n");
    write(clnt_sock, lsBuf, sizeof(lsBuf));

    while(1)
    {
        printf("Waiting... \n");

        memset(lsBuf, 0x00, sizeof(lsBuf));
        liRtn = recv(clnt_sock, lsBuf, sizeof(lsBuf)-1, 0);
        if(liRtn < 0)
            error_handling("recv error");
        printf("Recv Success[%d]!! \n", liRtn);

        if(memcmp(lsBuf, "quit", liRtn-2) == 0)
        {
            printf("Close Client Connection... \n");
            break;
        }

        printf(">> Client Msg : %s \n", lsBuf);

        printf("<< Send Msg : ");
        memset(lsBuf, 0x00, sizeof(lsBuf));
        fgets(lsBuf, sizeof(lsBuf), stdin);

        send(clnt_sock, lsBuf, sizeof(lsBuf), 0);

        if(strcmp(lsBuf, "quit") == 0) break;
    }


    close(clnt_sock);
    close(serv_sock);

    return 0;
}

 

 

통신 확인은 telent 이 있을경우 위의 서버 프로세스 실행시킨후 telnet으로 연결시도하면 됨.

'통신 > 소켓' 카테고리의 다른 글

tcpdump - 통신로그확인 프로그램  (0) 2023.10.30
블로킹 소캣(송수신 버퍼 동작원리)  (0) 2022.07.18
소켓 주소 구조체  (0) 2022.07.18
소캣관련 함수 모음  (0) 2022.07.18
이론 - TCP / UDP  (0) 2022.07.18

+ Recent posts