How to make two-directional unix domain sockets with SOCK_DGRAM?

走远了吗. 提交于 2019-12-04 03:58:22

问题


I am trying to write a simple Unix datagram server/client, and am having some problems. What I want is a server that listens on a datagram socket and sends a reply to every message received, to the original sender. I decided to try first using socat to be the "server" and writing the client in C. I am running socat like this:

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo

To the best of my understanding this should listen on /tmp/test.socket and reply to everything that is received with the same string? Then I have a client program that looks like this (error checking removed for clarity):

int s = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un sa;
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path, "/tmp/test.socket");

const char *data = "Testing data";
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un));

printf("Sent!\n");

unsigned char *buffer = malloc(BUFFER_LENGTH);
struct sockaddr_storage recv_sa;
int recv_sa_len = 0;
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len);

for (int i = 0; i < recv_len; i++) {
    putc(buffer[i], stdout);
}
printf("\n");

It should send the packet (that works), receive a packet, and then print it out, but the program doesn't seem to be capable of receiving the packet. What am I doing wrong here, or do I have a fundamental misunderstanding about Unix sockets? Thanks!


回答1:


Take a look at the Michael Kerrisk's AF_UNIX SOCK_DGRAM example of the client/server program (client, server) published in his book The Linux Programming Interface, chapter 57.




回答2:


Socket need to have address to be addressed to receive packets. You can call bind() with unique socket filename based on the PID or in linux use autobound abstract address if to call before send:

bind(s, (const struct sockaddr *)&sa, sizeof(sa_family_t));



回答3:


You should call connect before of trying send nothing to the echo server.

Take a look at: http://beej.us/guide/bgipc/output/html/multipage/unixsock.html



来源:https://stackoverflow.com/questions/7325468/how-to-make-two-directional-unix-domain-sockets-with-sock-dgram

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!