IPC QLocalSocket>C,为什么我的连接失败?连接失败:[2](没有这样的文件?!)

2024-09-26 18:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我运行这个例子http://doc.qt.io/qt-5/qtcore-ipc-localfortuneserver-example.html

使用cat <socket_name>很好,我甚至设法与python连接。在

然而不幸的是,这失败了。->;connect()失败:[2][没有这样的文件或目录]?是吗

#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

#define SOCK_PATH "/Users/Name/socket"

int main(void) {
    int sockfd = 0,n = 0, err = 0;
    char recvBuff[1024];
    struct sockaddr_un serv_addr;
    const char* const pcSocketName = SOCK_PATH;
    memset(recvBuff, '0' ,sizeof(recvBuff));
    if((sockfd = socket(AF_UNIX, SOCK_STREAM, 0))< 0) {
        printf("\n Error : Could not create socket \n");
        return 1;
    }
    serv_addr.sun_family = AF_UNIX;
    serv_addr.sun_path[0] = '\0';
    strncpy(serv_addr.sun_path+1, pcSocketName, strlen(pcSocketName));
    err = connect(sockfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr));
    if(0 != err) {
        printf("connect() failed: [%d][%s]\n", errno, strerror(errno));
        return(-1);
    }
    while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0) {
        recvBuff[n] = 0;
        if(fputs(recvBuff, stdout) == EOF) {
            printf("\n Error : Fputs error");
        }
        printf("\n");
    }
    if( n < 0) {
        printf("\n Read Error \n");
    }
    printf("Over..\n");
    return 0;
}

我在MacOS上运行,用gcc构建。这段代码的一部分是从网上的不同地方拼凑而成的。在


Tags: ifincludeconnectsyssocketsockaddrerr
1条回答
网友
1楼 · 发布于 2024-09-26 18:05:07

套接字路径复制行错误:

strncpy(serv_addr.sun_path+1, pcSocketName, strlen(pcSocketName));

您要将pcSocketName复制到serv_addr.sun。另外,保护strlen(pcSocketName)在这里没有任何意义。你可以用

^{pr2}$

在这个简单的例子中,strcpy是安全的,如果我们确定SOCK_PATH的长度足够小,可以放入缓冲区serv_addr.sun_path。但是,为了避免意外错误,或者在字符串长度可能变化的更复杂的情况下,防止潜在的溢出是有意义的。函数strncpy可用于从pcSocketName复制不超过sizeof(serv_addr.sun_path) - 1个字节。为零终止字符保留一个字节。如果在strncpy中达到长度限制,则不会追加最后一个空字符。因此,应手动设置:

serv_addr.sun_path[sizeof(serv_addr.sun_path) - 1] = '\0';
strncpy(serv_addr.sun_path, pcSocketName, sizeof(serv_addr.sun_path) - 1);

我猜你的代码是基于Can not connect to Linux "abstract" unix socket

这导致了最初的连接问题。sun_path[]中的第一个字节应为零(serv_addr.sun_path[0] = '\0';),才能使用抽象命名空间UNIX sockets。但是,这种抽象名称空间是不可移植的Linux扩展:

  • 抽象命名空间套接字在Mac OS X(和OS X)上不受支持
  • QtQLocalSocket甚至在Linux上也不支持它:QTBUG-16090

因此,QLocalSocket与文件系统套接字一起工作。这样的套接字应该在C中通过sun_path中以空结尾的文件系统路径名访问。在

相关问题 更多 >

    热门问题