본문 바로가기

네트워크 & 통신

c 소켓 프로그래밍 예제

c 소켓 양뱡향 통신 예제 

서버 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
int main(int argc, char* argv[])
{
        int serv_sock;
        char message[BUF_SIZE];
        int str_len;
        socklen_t clnt_adr_sz;
        
        //UDP 소켓 생성
        serv_sock = socket(PF_INET, SOCK_DGRAM, 0);
        if (serv_sock == -1)
        	printf("UDP socket creation error");
        
        memset(&serv_adr, 0, sizeof(serv_adr));
        serv_adr.sin_family = AF_INET; //프로토콜 
        serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); //호스트 주소
        serv_adr.sin_port = htons(atoi(argv[1])); //포트 번호 
        
        if(bind(serv_sock, (struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)
                printf("bind error \n");
                
         while(1)
        {
                clnt_adr_sz = sizeof(clnt_adr);
                str_len = recvfrom(serv_sock, message, BUF_SIZE, 0, (struct sockaddr*)&cl>
                printf("message from client: %s\n", message);
                sendto(serv_sock, message, str_len, 0, (struct sockaddr*)&clnt_adr, clnt_>
        }

        close(serv_sock);
        return 0;

}

 

클라이언트

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30

int main(int argc, char* argv[])
{
        int sock;
        char message[BUF_SIZE];
        int str_len;
        socklen_t adr_sz;

        struct sockaddr_in serv_adr, from_adr;

        if(argc != 3)
        {
                printf("Usage: %s <IP> <port>\n", argv[0]);
                exit(1);
        }

        sock = socket(PF_INET, SOCK_DGRAM, 0);

        if(sock == -1)
                printf("socket() error");
                //error_handling("socket() error");

        memset(&serv_adr, 0, sizeof(serv_adr));
        serv_adr.sin_family = AF_INET;
        serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
        serv_adr.sin_port = htons(atoi(argv[2]));
        
        while(1)
        {
                fputs("Insert message(q to quit): ", stdout);
                fgets(message, sizeof(message), stdin);
                if (!strcmp(message, "q\n") || !strcmp(message, "Q\n"))
                        break;
                sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_adr, si>
                str_len = recvfrom(sock, message, BUF_SIZE, 0, (struct sockaddr*)&from_ad>
                message[str_len] = 0;
                printf("Message from server: %s", message);
        }
        close(sock);
        return 0;
        
}

 

 

sendmsg, recvmsg 예제 

 

서버

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

int main(int argc, char* argv[])
{
        int sock;
        char message[BUF_SIZE];
        int str_len;

        struct sockaddr_in serv_adr;

        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if(sock == -1)
                printf("UDP socket creation error");

        memset(&serv_adr, 0, sizeof(serv_adr));
        serv_adr.sin_family =  AF_INET;
        serv_adr.sin_addr.s_addr = inet_addr("127.0.0.1");
        serv_adr.sin_port = htons(5555);

        if(bind(sock, (struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)
                printf("bind error \n");

        struct msghdr msghdr;
        struct iovec iovec;

        iovec.iov_base = (void*)message;
        iovec.iov_len = sizeof(message);
        msghdr.msg_name = &serv_adr;
        msghdr.msg_namelen = sizeof(struct sockaddr_in);
        msghdr.msg_iov = &iovec;
        msghdr.msg_iovlen = 1;

        while(1)
        {
                int ret = recvmsg(sock, &msghdr, 0);
                if(ret > 0)
                        printf("message: %s\n", message);
        }

        close(sock);
        return 0;
}

클라이언트

/* 실행 방밥
 * ./udp_client "보낼 문자열"
*/ 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>

#define BUF_SIZE 1024

int main(int argc, char **argv)
{

        int sock;
        char message[BUF_SIZE];

        struct sockaddr_in serv_adr;

        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

        if(sock == -1)
                printf("socket() error");

        memset(&serv_adr, 0, sizeof(serv_adr));
        serv_adr.sin_family = AF_INET;
        serv_adr.sin_addr.s_addr = inet_addr("127.0.0.1");
        serv_adr.sin_port = htons(5555);

        struct msghdr msg;
        struct iovec iv;

        memset(&msg, 0, sizeof(msg));
        msg.msg_name = &serv_adr;
        msg.msg_namelen = sizeof(struct sockaddr_in);
        iv.iov_base = (void*)argv[1];
        iv.iov_len = strlen(argv[1]+1);
        msg.msg_iov = (struct iovec *)&iv;
        msg.msg_iovlen = 1;
        int ret = sendmsg(sock, &msg, 0);
        close(sock);
        return 0;

}

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

라즈베리파이 <-> 안드로이드 블루투스 통신 예제  (1) 2023.09.03
스위치 vs 브릿지  (0) 2023.03.25
Modbus 실습  (0) 2023.02.14
Modbus 공부  (2) 2023.02.14