Сервер:
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define _SOCK_PATH "/tmp/srv.sock"
int
srv(int clientfd) {
while (1) {
int length;
char *text;
/* $-1¨´¨Û¨Ø¨Ý¨Ð ¨á¨Þ¨Þ¨Ñ¨é¨Õ¨Ý¨Ø¨ï */
if (read(clientfd, &length, sizeof(&length)) == 0)
return 0;
text = (char *) malloc(length);
read(clientfd, text, length);
fprintf(stderr, "%s\n", text);
free(text);
if (!strcasecmp(text, "quit"))
return 1;
}
}
int
main(int argc, char *argv[]) {
int sockfd, rv, quit_flag;
struct sockaddr_un srv_addr;
sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
if (sockfd < 0)
err(EX_UNAVAILABLE, "socket");
unlink(_SOCK_PATH);
memset(&srv_addr, 0, sizeof(struct sockaddr_un));
srv_addr.sun_family = AF_LOCAL;
strncpy(srv_addr.sun_path, _SOCK_PATH, strlen(_SOCK_PATH) + 1);
rv = bind(sockfd, (struct sockaddr *) &srv_addr, SUN_LEN(&srv_addr));
if (rv < 0) {
close(sockfd);
err(EX_UNAVAILABLE, "bind");
}
/* $-1¨¾¨Ö¨Ø¨Ô¨Ð¨Ý¨Ø¨Õ ¨×¨Ð¨ß¨à¨Þ¨á¨Þ¨Ò */
listen(sockfd, 5);
do {
struct sockaddr_un client_addr;
socklen_t client_addr_len;
int clientfd;
clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
quit_flag = srv(clientfd);
close(clientfd);
} while (!quit_flag);
close(sockfd);
unlink(_SOCK_PATH);
return 0;
}
Клиент:
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <sysexits.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define _SOCK_PATH "/tmp/srv.sock"
int
main(int argc, char *argv[]) {
int sockfd, rv;
const char * const message = argc > 1 ? argv[1] : "Null message";
struct sockaddr_un client_addr;
sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
if (sockfd < 0)
err(EX_UNAVAILABLE, "socket");
memset(&client_addr, 0, sizeof(struct sockaddr_un));
client_addr.sun_family = AF_LOCAL;
strncpy(client_addr.sun_path, _SOCK_PATH, strlen(_SOCK_PATH) + 1);
rv = connect(sockfd, (struct sockaddr *) &client_addr, SUN_LEN(&client_addr));
if (rv < 0)
err(EX_UNAVAILABLE, "connect");
do {
int length = strlen(message) + 1;
write(sockfd, &length, sizeof(length));
write(sockfd, message, length);
} while (0);
close(sockfd);
return 0;
}
Запускаешь сначала сервер, он начинает прослушивать /tmp/srv.sock. Затем запускаешь клиент передав ему в качестве аргумента произвольную строку (она будет послана на сервер).