我运行这个例子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构建。这段代码的一部分是从网上的不同地方拼凑而成的。在
套接字路径复制行错误:
您要将
^{pr2}$pcSocketName
复制到serv_addr.sun
。另外,保护strlen(pcSocketName)
在这里没有任何意义。你可以用在这个简单的例子中,
strcpy
是安全的,如果我们确定SOCK_PATH
的长度足够小,可以放入缓冲区serv_addr.sun_path
。但是,为了避免意外错误,或者在字符串长度可能变化的更复杂的情况下,防止潜在的溢出是有意义的。函数strncpy
可用于从pcSocketName
复制不超过sizeof(serv_addr.sun_path) - 1
个字节。为零终止字符保留一个字节。如果在strncpy
中达到长度限制,则不会追加最后一个空字符。因此,应手动设置:我猜你的代码是基于Can not connect to Linux "abstract" unix socket
这导致了最初的连接问题。
sun_path[]
中的第一个字节应为零(serv_addr.sun_path[0] = '\0';
),才能使用抽象命名空间UNIX sockets。但是,这种抽象名称空间是不可移植的Linux扩展:QLocalSocket
甚至在Linux上也不支持它:QTBUG-16090因此,
QLocalSocket
与文件系统套接字一起工作。这样的套接字应该在C中通过sun_path
中以空结尾的文件系统路径名访问。在相关问题 更多 >
编程相关推荐