내부 프로세스끼리 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) (159) | 2012.07.24 |
---|---|
select 함수 예제 (167) | 2012.07.23 |
semget. semop, semctl 함수 예제 (14) | 2012.07.17 |
mmap / munmap 함수 예제 (12) | 2012.07.17 |
shmget/ shmat 함수 예제 (8) | 2012.07.13 |