내부 프로세스끼리 TCP 또는 UDP 프로토콜을 이용해서 통신하도록

도와주는 소켓이다. 아래의 예제를 보면 이 앞의 다른 IPC 통신과는 달리

특정 함수 API가 제공되지는 않는다. 기존의 TCP/IP 통신하는 소스코드와 거의 동일함.

 

 

================================================

 

서버측 소스 코드
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/socket.h"
#include "sys/un.h"
#include 
#include 
#include 
#include 

#define MAXLINE 1024 

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int state, client_len;
    pid_t pid;

    FILE *fp;
    struct sockaddr_un clientaddr, serveraddr;

    char buf[MAXLINE]; 

    if (argc != 2) {
        printf("Usage : %s [socket file name]\n", argv[0]);
        exit(0);
    }

    if (access(argv[1], F_OK) == 0) {
        unlink(argv[1]);
    }

     client_len = sizeof(clientaddr);
     if ((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
         perror("socket error : ");
         exit(0);
     }
     bzero(&serveraddr, sizeof(serveraddr));
     serveraddr.sun_family = AF_UNIX;
     strcpy(serveraddr.sun_path, argv[1]);

     state = bind(server_sockfd , (struct sockaddr *)&serveraddr,
             sizeof(serveraddr));
     if (state == -1) {
         perror("bind error : ");
         exit(0);
     }

     state = listen(server_sockfd, 5);
     if (state == -1) {
         perror("listen error : ");
         exit(0);
     }
     while(1)
     {
         client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
                 &client_len);
         pid = fork();
         if (pid == 0)
         {
             if (client_sockfd == -1) {
                 perror("Accept error : ");
                 exit(0);
             }

             while(1)
             {
                 memset(buf, 0x00, MAXLINE);
                 if (read(client_sockfd, buf, MAXLINE) <= 0) {
                     close(client_sockfd);
                     exit(0);
                 }
                 printf("RECV-> %s\n", buf);
                 write(client_sockfd, buf, strlen(buf));
             }
         }
     }
     close(client_sockfd);
}
클라이언트 측 소스코드
#include 
#include "sys/un.h"
#include 
#include 
#include 

#define MAXLINE 1024 


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

    int client_len;
    int client_sockfd;

    FILE *fp_in;
    char buf_in[MAXLINE]; 
    char buf_get[MAXLINE]; 

    struct sockaddr_un clientaddr;

    if (argc != 2) {
        printf("Usage : %s [file_name]\n", argv[0]);
        exit(0);
    }

    client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (client_sockfd == -1) {
        perror("error : ");
        exit(0);
    }

    bzero(&clientaddr, sizeof(clientaddr));
    clientaddr.sun_family = AF_UNIX;
    strcpy(clientaddr.sun_path, argv[1]);
    client_len = sizeof(clientaddr);

    if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0)
    {
        perror("Connect error: ");
        exit(0);
    }
    while(1)
    {
        memset(buf_in, 0x00, MAXLINE); 
        memset(buf_get, 0x00, MAXLINE); 
        printf("> "); 
        fgets(buf_in, MAXLINE, stdin);
        write(client_sockfd, buf_in, strlen(buf_in));
        read(client_sockfd, buf_get, MAXLINE);
        printf("-> %s", buf_get);
    }

    close(client_sockfd);
    exit(0);
}
서버측 결과화면
RECV-> opipoipoikl

RECV-> 1

클라이언트측 결과화면
INPUT-> opipoipoikl
RECV-> opipoipoikl
INPUT-> 1
RECV-> 1

================================================

 

 

테스트하는 경우 %[실행파일명] [통신에 사용할 파일명]

저 파일을 설정해주고 사용하는 것만

다르고 나머지는 기본 TCP/IP와 동일하다.

 

다시 보니 이해가 좀 되네..

'Language > C' 카테고리의 다른 글

GCC 컴파일러 에러 메세지 리스트(Error Message List)  (0) 2012.07.24
select 함수 예제  (0) 2012.07.23
Unix Domain Socket 예제  (0) 2012.07.23
semget. semop, semctl 함수 예제  (0) 2012.07.17
mmap / munmap 함수 예제  (0) 2012.07.17
shmget/ shmat 함수 예제  (0) 2012.07.13

+ Recent posts