Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法打印客户端sun_路径unix域套接字_C++_Unix Socket - Fatal编程技术网

C++ 无法打印客户端sun_路径unix域套接字

C++ 无法打印客户端sun_路径unix域套接字,c++,unix-socket,C++,Unix Socket,这里是我正在使用的UNix域服务器和客户端代码。服务器和客户端通过相互接收消息来相互发送消息 服务器代码通过填充客户端地址从recvfrom向客户端发送消息。此外,正如您所看到的,这个unix域套接字代码使用抽象命名系统。服务器名为UnixServer,客户端名为UnixClient。若服务器可以通过填充其客户机地址向客户机发送消息,我想看看那个地址是什么。这是一个有意义的地址吗?我可以将其打印为#UdsClient等吗 服务器代码: #include <sys/socket.h>

这里是我正在使用的UNix域服务器和客户端代码。服务器和客户端通过相互接收消息来相互发送消息

服务器代码通过填充客户端地址从recvfrom向客户端发送消息。此外,正如您所看到的,这个unix域套接字代码使用抽象命名系统。服务器名为UnixServer,客户端名为UnixClient。若服务器可以通过填充其客户机地址向客户机发送消息,我想看看那个地址是什么。这是一个有意义的地址吗?我可以将其打印为#UdsClient等吗

服务器代码:

#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h> 
#include <string.h>

#include <unistd.h>`

#define SERVER_SOCKET "#UdsServer" // The # is replaced by 0 for abstract namespace

int main(void)
{
int socket_fd;
struct sockaddr_un server_address, client_address; 
int bytes_received, bytes_sent, integer_buffer;


socklen_t address_length = sizeof(server_address.sun_family)+strlen(SERVER_SOCKET );

if ((socket_fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
{
    perror("server: socket");
    return -1;
}

memset(&server_address, 0, sizeof(server_address));
server_address.sun_family = AF_UNIX;
memcpy(server_address.sun_path, SERVER_SOCKET,sizeof(SERVER_SOCKET)-1);// the path is not a C string, and is not NULL turminated
server_address.sun_path[0] = 0; 

if (bind(socket_fd,
         (const struct sockaddr *) &server_address,
         address_length) < 0)
{
    perror("server: bind");
    close(socket_fd);        
    return -1;
}

for (;;)
{
    bytes_received = recvfrom(socket_fd,
                              &integer_buffer,
                              sizeof(integer_buffer),
                              0, 
                              (struct sockaddr *) &client_address,
                              &address_length);

    

    struct sockaddr_storage ss;
    socklen_t sslen = sizeof(struct sockaddr_storage);
    if (getsockname(socket_fd, (struct sockaddr *)&ss, &sslen) == 0) {
           struct sockaddr_un *un = (struct sockaddr_un *)&ss;
           printf("socket name is: %s\n", un->sun_path);
    }

    if(bytes_received != sizeof(integer_buffer))
    {
        printf("Error: recvfrom - %d.\n", bytes_received);

    } else {
        printf("received: %d.\n", integer_buffer);



        integer_buffer += 10;

        bytes_sent = sendto(socket_fd,
                            &integer_buffer,
                            sizeof(integer_buffer),
                            0,
                            (struct sockaddr *) &client_address, 
                            address_length);

    //printf("clientaddress: %s", client_address.sa_data);
    }
}

close(socket_fd);

return 0;
}
我做错了什么?如何打印UdsClient或任何其他有意义的完整内容

编辑,我的解决方案

我相信这是一个相对容易的问题。我可以阅读下面的代码,而不是最后一段代码:

printf("socket name is: #%s\n", client_address.sun_path + 1);
因此会填充路径,但由于第一个字母为空,因此无法直接打印出来


您也可以将此方法用于非抽象文件路径系统。

当您使用
%s
作为
printf
的格式说明符时,它将把相关参数视为以null结尾的字符数组。但是,您正在通过设置

server_address.sun_path[0] = 0;

因此,
printf
将把
server\u address.sun\u path
视为一个零长度字符串——它不知道紧跟在前导空字符之后的数据。

那么该怎么办呢?有没有办法读懂它?我想阅读此信息,因为在我的实际系统中,将有多个客户端,我需要它们的抽象命名如果您绝对确定
un->sun\u path
引用了一个抽象的套接字名称,那么您可以尝试
printf(“套接字名称为:#%s\n”,un->sun\u path+1)
取决于您希望如何表示前导空字符。谢谢,但它会将UdsServer打印为地址。但是我找到了一个解决办法你能支持我的问题吗?我可以选择u作为答案。
printf("socket name is: #%s\n", client_address.sun_path + 1);
server_address.sun_path[0] = 0;