C++ Unix数据报套接字仅适用于第一帧

C++ Unix数据报套接字仅适用于第一帧,c++,c,linux,C++,C,Linux,我正在尝试使用UNIX数据报套接字进行IPC,但在实现方面遇到了问题。我能够成功地完成UNIX流套接字,但我的程序的功能要求使用数据报 以下是发送端的代码: struct sockaddr_un remote; struct sockaddr_un local; socklen_t size_remote; socklen_t size_local; if(out_sock == -1) { if ((out_sock = socket(AF_UNIX, SOCK_DGRAM, 0))

我正在尝试使用UNIX数据报套接字进行IPC,但在实现方面遇到了问题。我能够成功地完成UNIX流套接字,但我的程序的功能要求使用数据报

以下是发送端的代码:

struct sockaddr_un remote;
struct sockaddr_un local;
socklen_t size_remote;
socklen_t size_local;
if(out_sock == -1)
{
    if ((out_sock = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1)
    {
        perror("toYYYYY socket");
        exit(1);
    }

    char remote_path[28] = "/tmp/sockets/fromXXXXXXX0000";
    sprintf(remote_path + 24, "%d", portOffset + XXXXXX_CTRL_UDP_PORT);
    memset(&remote, 0, sizeof(struct sockaddr_un));
    remote.sun_family = AF_UNIX;
    strcpy(remote.sun_path, remote_path);
    size_remote = (offsetof(struct sockaddr_un, sun_path) + strlen(remote_path));

    char local_path[28] = "/tmp/sockets/toYYYYY0000";
    sprintf(local_path + 20, "%d", portOffset + XXXXXX_CTRL_UDP_PORT);
    memset(&local, 0, sizeof(struct sockaddr_un));
    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, local_path);
    size_local = (offsetof(struct sockaddr_un, sun_path) + strlen(local_path));

    unlink(local_path);
    int rtv = bind(out_sock, (struct sockaddr *)&local, size_local);
    if(rtv)
            perror("toYYYYY bind");

}
written = sendto(out_sock, packet, bytes, 0, (struct sockaddr *)&remote, size_remote);

if (written != bytes)
{
    status = AS_FAILURE;
    perror("toYYYYY send");
}

return status;
接收端将毫无疑问地获得发送的第一帧。但是,sendto函数在成功发送时抛出“无此类文件或目录”错误。以下两次发送产生相同的错误,但是sendto函数返回(-1),而不是像第一次调用中那样返回正确的缓冲区长度。在随后的sendto调用中,错误变为“Transort端点未连接”

接收过程的复制/粘贴更加复杂,但本质上它首先从套接字调用获取文件描述符,设置地址结构,绑定,并使用recvfrom()读取

以下是一个示例输出日志,可能有用,也可能没有帮助:

接收过程输出 发送进程输出 我的问题是:
  • 如果SOCK_DGRAM是无连接的,而我使用的是sendto(),为什么它会抱怨传输端点
  • 为什么第一个帧可以发送,而其他帧不行?为什么成功的帧仍然抛出错误
  • 我怎样才能解决这个问题

  • 只有当
    out\u sock==-1
    时,才能初始化
    remote
    。第二次调用函数
    remote
    时将取消初始化,因此会出现错误。

    在调用sendto之前,请尝试将errno设置为0,因为sendto不会清除上的errnosuccess@DrewMcGowen你改变错误的想法是对的。它现在返回成功。但是,我仍然有其他问题。问题可能是服务器在执行一次循环后消失,错误消息完全准确。您的日志显示接收方关闭套接字,然后发送方出现错误。这有什么神秘之处?哇,非常感谢。我知道有人会出现,让我看起来很愚蠢:)
    remote_len: 30
    local_len: 26
    local: '/tmp/sockets/toYYYYY5248' remote: '/tmp/sockets/fromXXXXXXX5248'
    Binding to: '/tmp/sockets/fromXXXXXXX5248'
    entered selected (This is receiving function with recvfrom())
    recv from '/tmp/sockets/toYYYYY5248' len: 263
    Closing socket
    
    send (successful call): Success
    send: No such file or directory
    send: No such file or directory
    send: Transport endpoint is not connected
    send: Transport endpoint is not connected
    send: Transport endpoint is not connected
    send: Transport endpoint is not connected
    send: Transport endpoint is not connected
    send: Transport endpoint is not connected
    send: Transport endpoint is not connected
    send: Transport endpoint is not connected