大体上参考这里,http://philherlihy.com/unix-domain-sockets-datagram/
改动之后如下
服务端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
char * server_filename = "/tmp/socket-server";
int main(void)
{
int s = socket(AF_UNIX, SOCK_DGRAM, 0);
if (s == -1) {
perror("socket server");
exit(1);
}
struct sockaddr_un srv_un = {0};
srv_un.sun_family = AF_UNIX;
strncpy(srv_un.sun_path, server_filename, sizeof(srv_un.sun_path));
unlink(server_filename);
if (bind(s, (struct sockaddr *)&srv_un, sizeof(srv_un)) == -1) {
perror("bind server");
exit(1);
}
for(;;) {
struct sockaddr_un cli_addr = {0};
socklen_t cli_addr_len = sizeof(cli_addr);
int msg;
int recv_size = recvfrom(s, &msg, sizeof(msg), 0, (struct sockaddr*)&cli_addr, &cli_addr_len);
if (recv_size < 0) {
perror("recvfrom");
break;
}
printf("recv %d\n", msg);
msg *= 2;
int sendto_size = sendto(s, &msg, sizeof(msg), 0, (struct sockaddr*)&cli_addr, sizeof(cli_addr));
if (sendto_size < 0) {
perror("sendto");
return -1;
}
printf("send %d\n", msg);
}
close(s);
unlink(server_filename);
return 0;
}
客户端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
char * server_filename = "/tmp/socket-server";
char * client_filename = "/tmp/socket-client";
int main(void)
{
int s = socket(AF_UNIX, SOCK_DGRAM, 0);
if (s == -1) {
perror("socket server");
exit(1);
}
{
struct sockaddr_un cli_un = { 0 };
cli_un.sun_family = AF_UNIX;
strncpy(cli_un.sun_path, client_filename, sizeof(cli_un.sun_path));
unlink(client_filename);
if (bind(s, (struct sockaddr *)&cli_un, sizeof(cli_un)) == -1) {
perror("bind client");
exit(1);
}
}
{
struct sockaddr_un srv_un = {0};
srv_un.sun_family = AF_UNIX;
strncpy(srv_un.sun_path, server_filename, sizeof(srv_un.sun_path));
int msg = 1006;
int sendto_size = sendto(s, &msg, sizeof(msg), 0, (struct sockaddr*)&srv_un, sizeof(srv_un));
if (sendto_size < 0) {
perror("sendto");
return -1;
}
printf("send %d\n", msg);
}
{
struct sockaddr_un cli_un = { 0 };
socklen_t cli_len = sizeof(cli_un);
int msg;
int recv_size = recvfrom(s, &msg, sizeof(msg), 0, (struct sockaddr*)&cli_un, &cli_len);
if (recv_size < 0) {
perror("recvfrom");
return -1;
}
printf("recv %d\n", msg);
}
close(s);
unlink(client_filename);
return 0;
}