본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

c언어 리눅스(linux) TCP/IP 예제

by 주용사 2023. 1. 8.
728x90

클라이언트에서 입력값을 받아와 서버에 전달해준다(구조체)



servertcp.c

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

#define PORT 9999

typedef struct {
        int a;
        char b[10];
}Form;

// servertcp.c
int main(void){
        int sock, client_sock;
        struct sockaddr_in addr, client_addr;
        int len, addr_len, recv_len;

        Form form;

        if((sock = socket(AF_INET, SOCK_STREAM, 0))<0) // UDP는 SOCK_STREAM -> SOCK_DGRAM
        {
                perror("socket ");
                return 1;
        }

        memset(&addr, 0x00, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_ANY); // 모든 IP에서 받을 수 있다.
        addr.sin_port = htons(PORT);

        if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){
                perror("bind ");
                return 1;
        }

        if(listen(sock, 5) < 0) // udp랑 다른점 -> 접속연결 대기
        {
                perror("listen ");
                return 1;
        }

        addr_len = sizeof(client_addr);

        printf("waiting for client..\n");

        while((client_sock = accept(sock, (struct sockaddr *)&client_addr, &addr_len)) > 0) // client 접속을 받아들임 -> 받고난후도 계속 돈다.
        {
                printf("client ip : %s\n", inet_ntoa(client_addr.sin_addr));

                if((recv_len = recv(client_sock, &form, sizeof(form), 0)) < 0) // client의 접속을 허가하면 client로부터 받는다.
                {
                        perror("recv ");
                        return 1;
                        break;
                }
                printf("received data : %d, %s\n", form.a, form.b);
                send(client_sock, &form, sizeof(form), 0); // 보내주고 종료

                close(client_sock);
        }
        close(sock);
        return 0;
}

 

clienttcp.c

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

#define PORT 9999

typedef struct {
        int a;
        char b[10];
}Form;

// clienttcp.c
int main(int argc, char** argv){
        int sock;
        struct sockaddr_in addr;
        int recv_len;

        Form form;

        if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) // socket 생성
        {
                perror("socket ");
                return 1;
        }

        memset(&addr, 0x00, sizeof(addr)); // 초기화
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr("127.0.0.1");
        addr.sin_port = htons(PORT);

        if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){ // server에 접속
                perror("connect ");
                return 1;
        }

        form.a = argc;
        memcpy(form.b, argv[1],sizeof(form.b));
        if(send (sock, &form, sizeof(form), 0) < 0) // 연결수신 받으면 server로 send
        {
                perror("send ");
                return 1;
        }

        if((recv_len = recv(sock, &form, sizeof(form), 0)) < 0) // server로부터 받는다.
        {
                perror("recv ");
                return 1;
        }

        printf("recevied data : %d, %s\n", form.a, form.b);

        close(sock);

        return 0;
}

 

https://nroses-taek.tistory.com/88?category=744219

728x90