Linux 使用双向unix域套接字首次运行时没有地址

Linux 使用双向unix域套接字首次运行时没有地址,linux,datagram,bidirectional,unix-socket,localsocket,Linux,Datagram,Bidirectional,Unix Socket,Localsocket,我有两个守护进程—一个客户端和一个服务器—通过unix域套接字和本地套接字进行通信。我遇到的问题是,第一次使用函数recvfrom在服务器中接收数据报时,recvfrom函数提供的客户机地址为空。但是,提供的客户端地址的大小似乎是正确的。如果在客户端守护进程中将地址长度增加到更长的名称,这将反映在服务器上地址大小的增加中。此外,接收到的数据是正确的 请注意,我只有在服务器第一次收到数据报时才遇到这个问题。当接收到其他数据报时,地址字段是正确的 有没有任何一位专家能够理解什么可能是错误的 服务器代

我有两个守护进程—一个客户端和一个服务器—通过unix域套接字和本地套接字进行通信。我遇到的问题是,第一次使用函数recvfrom在服务器中接收数据报时,recvfrom函数提供的客户机地址为空。但是,提供的客户端地址的大小似乎是正确的。如果在客户端守护进程中将地址长度增加到更长的名称,这将反映在服务器上地址大小的增加中。此外,接收到的数据是正确的

请注意,我只有在服务器第一次收到数据报时才遇到这个问题。当接收到其他数据报时,地址字段是正确的

有没有任何一位专家能够理解什么可能是错误的

服务器代码: }

客户端代码:
我发现了我的错误。我应该在服务器代码中完成地址长度全局变量的初始化:

//socklen_t address_length = 0;
socklen_t address_length = sizeof(myclient_address.sun_path);
因为address_length是recvfrom函数的值结果参数

int fd;

struct sockaddr_un mycli_addr;

fd = socket(AF_UNIX, SOCK_DGRAM, 0);
if (fd < 0) {
  f_warning("socket error");
}

memset(&addr, 0, sizeof(addr));
memset(&mycli_addr, 0, sizeof(mycli_addr));
addr.sun_family = AF_UNIX;
mycli_addr.sun_family = AF_UNIX;

char *socket_path = "#myserver";
char *mycli_socket_path = "#myclient";

strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path));
strncpy(mycli_addr.sun_path, mycli_socket_path, sizeof(mycli_addr.sun_path));
addr.sun_path[0] = '\0';
mycli_addr.sun_path[0] = '\0';

unlink(socket_path);
unlink(mycli_socket_path);

int er;
er = bind(fd, (struct sockaddr*)&mycli_addr, sizeof(mycli_addr));
if (er < 0) {
  f_warning("bind error");
}

if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
  f_warning("connect error");
}

session->socket_io_channel = g_io_channel_unix_new(fd);
session->socket_io_src_id = g_io_add_watch(session->socket_io_channel,
                                           G_IO_IN,
                                          client_socket_in_data_callback,
                                           session);

sendto(session->socket, (char *) mydata, data_length, 0,
      (struct sockaddr *) &addr,
      sizeof(struct sockaddr_un));
//socklen_t address_length = 0;
socklen_t address_length = sizeof(myclient_address.sun_path);