Skip to content

Instantly share code, notes, and snippets.

@surinoel
Last active July 23, 2019 03:05
Show Gist options
  • Save surinoel/e9f160b1e8fc2cf516fdf1b99cb9d0d1 to your computer and use it in GitHub Desktop.
Save surinoel/e9f160b1e8fc2cf516fdf1b99cb9d0d1 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
static void print_usage(char *progname)
{
printf("usage : %s [server|client]\n", progname);
}
static int do_server(void)
{
/*
socket
bind
listen
accept
write/read
*/
int ret, sockfd, clifd;
struct sockaddr_un servaddr;
char buf[128];
/*
Address format
A UNIX domain socket address is represented in the following structure:
struct sockaddr_un {
sa_family_t sun_family;
char sun_path[108];
};
*/
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(sockfd < 0) {
perror("socket");
return -1;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sun_family = AF_UNIX;
strcpy(servaddr.sun_path, "./sockpath");
ret = bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(ret < 0) {
perror("bind");
close(sockfd);
return -1;
}
ret = listen(sockfd, 8);
if(ret < 0) {
perror("listen");
close(sockfd);
return -1;
}
// socket IPC에서는 클라이언트 정보를 받아올 필요는 없다
clifd = accept(sockfd, NULL, NULL);
if(clifd < 0) {
perror("accept");
close(sockfd);
return -1;
}
memset(buf, 0, sizeof(buf));
// recv는 clifd를 socket fd로 전
recv(clifd, buf, sizeof(buf), 0);
printf("Received data : %s\n", buf);
close(sockfd);
close(clifd);
return 0;
}
static int do_client(void)
{
int sockfd, ret;
struct sockaddr_un cliaddr;
char buf[128];
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(sockfd < 0) {
perror("socket");
return -1;
}
memset(&cliaddr, 0, sizeof(cliaddr));
cliaddr.sun_family = AF_UNIX;
strcpy(cliaddr.sun_path, "./sockpath");
ret = connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
if(ret < 0) {
perror("connect");
close(sockfd);
return -1;
}
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf), "This is msg from sock_stream");
ret = send(sockfd, buf, sizeof(buf), 0);
if(ret < 0) {
perror("send");
close(sockfd);
return -1;
}
close(sockfd);
return 0;
}
int main(int argc, char **argv)
{
int ret;
if(argc < 2) {
print_usage(argv[0]);
return -1;
}
if(!strcmp(argv[1], "server")) {
ret = do_server();
} else if(!strcmp(argv[1], "client")) {
ret = do_client();
} else {
print_usage(argv[0]);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment