我正在编写一个应用程序,它在Unix域套接字上监听UDP数据包。请考虑下面的代码块。
int sockfd;
struct sockaddr_un servaddr;
sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("socket() failed");
}
unlink(port);
bzero(&servaddr, sizeof(servaddr));
servaddr.sun_family = AF_LOCAL;
strcpy(servaddr.sun_path, port);
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
perror("bind() failed");
close(sockfd);
}
int n;
struct sockaddr_un cliaddr;
socklen_t len = sizeof(cliaddr);
discovery_msgs client_message;
bzero(&client_message, sizeof(client_message));
// Wait for a message to be received
n = recvfrom(sock_fd, &client_message, sizeof(client_message), 0,
(struct sockaddr *) &cliaddr, &len);
// At this point n = 560, client_message is filled with the expected data
//len = 0 and cliaddr has no information about the client that sent the data
现在,
client_message
的类型并不重要,我正在接收一个UDP数据包,client_message
中包含了我需要的所有数据。问题出现在我调用recvfrom
后查看cliaddr
和len
时。与普通的网络TCP/UDP不同,recvfrom
没有像平常一样修改cliaddr
,而且调用后将len
设置为0(这意味着recvfrom没有向&cliaddr
写入任何数据)。我需要在cliaddr
中填充Unix域路径的信息,以便我可以发送响应。
我做错了什么?
socket()
、bind()
和recvfrom()
返回的值是什么? - user207421