UNIX域套接字——UNIX domain socket(DGRAM)
#define UNIX_PATH_MAX 108 #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #define BUFSIZE 32 int main(void) { int sd; char buf[BUFSIZE]; struct sockaddr_un hisend; int ret; sd = socket(PF_LOCAL, SOCK_DGRAM, 0); if (sd == -1) { perror("socket()"); goto socket_err; } hisend.sun_family = AF_UNIX; snprintf(hisend.sun_path, UNIX_PATH_MAX, "rcv_sock"); ret = connect(sd, (struct sockaddr *)&hisend, sizeof(hisend)); if (ret == -1) { perror("connect()"); goto connect_err; } while (1) { ret = read(0, buf, BUFSIZE); /* if error */ if (ret == 0) { break; } write(sd, buf, ret); ret = read(sd, buf, BUFSIZE); if (ret == -1) { perror("read(sd)"); break; } write(1, buf, ret); } close(sd); return 0; accept_err: connect_err: close(sd); socket_err: return 1; }
#define UNIX_PATH_MAX 108 #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #define BUFSIZE 32 int main(void) { int sd; char buf[BUFSIZE]; struct sockaddr_un myend, hisend; socklen_t hislen; int ret; sd = socket(PF_LOCAL, SOCK_DGRAM, 0); if (sd == -1) { perror("socket()"); goto socket_err; } myend.sun_family = AF_UNIX; snprintf(myend.sun_path, UNIX_PATH_MAX, "rcv_sock"); unlink(myend.sun_path); ret = bind(sd, (struct sockaddr *)&myend, sizeof(myend)); if (ret == -1) { perror("bind()"); goto bind_err; } hislen = sizeof(hisend); while (1) { ret = recvfrom(sd, buf, BUFSIZE, 0, (struct sockaddr *)&hisend, &hislen); /* if error */ if (ret == 0) { break; } write(1, buf, ret); ret = sendto(sd, "xxxxx\n", 6, 0, (struct sockaddr *)&hisend, hislen); if (ret == -1) { perror("write(sd)"); break; } } close(sd); return 0; bind_err: close(sd); socket_err: return 1; }