gpt4 book ai didi

linux - Windows WSL 以上 Linux 中的 AF_UNIX 套接字无法绑定(bind)到/mnt 文件 : error 95, 操作不支持

转载 作者:行者123 更新时间:2023-12-03 08:03:55 24 4
gpt4 key购买 nike

我们需要将 Windows 客户端应用程序连接到 Linux 服务器应用程序。Linux 端在 Windows 10 (10.0.19044) 中的 WSL2 之上运行。

我们想要使用 UNIX 域套接字,并遵循 https://devblogs.microsoft.com/commandline/windowswsl-interop-with-af_unix/ 中的指导。

服务器程序成功绑定(bind)到“本地”文件系统中的文件(例如/tmp/mysock),但无法绑定(bind)到已安装驱动器中的“Windows 端”文件(例如/mnt/c/mysock),这是服务器可以接受来自 Windows 端 AF_UNIX 套接字的连接所必需的。

我得到的错误号是 95:“不支持操作”我尝试过使用 sudo 运行,但结果相同。

知道发生了什么吗?

服务器代码是:

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

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <errno.h>

#undef NDEBUG

// filename comes as command-line argument
int main(int argc, char *argv[])
{
struct sockaddr_un addr;
int ret = -1;

printf("Starting NVC_LINUX...\n");

assert(argc == 2);
char *filename = argv[1];

int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
assert(sfd != -1);

// Delete any file that already exists at the address. Make sure the deletion
// succeeds. If the error is just that the file/directory doesn't exist, it's fine.
ret = remove(filename);
assert(ret != -1 || errno == ENOENT);

// Zero out the address, and set family and path.
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
assert(strlen(filename) <= sizeof(addr.sun_path) - 1);
strncpy(addr.sun_path, filename, sizeof(addr.sun_path) - 1);

ret = bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un));
if (ret == -1) printf("errno : %d - %s\n", errno, strerror(errno));
assert(ret != -1);

ret = listen(sfd, 1);
assert(ret != -1);

printf("Waiting to accept a connection...\n");
// NOTE: blocks until a connection request arrives.
int cfd = accept(sfd, NULL, NULL);
assert(cfd != -1);
printf("Accepted socket fd = %d\n", cfd);

char cmd;
char res[32];
while (1)
{
// get char from Win side
ssize_t num_read = read(cfd, (void *) &cmd, sizeof(cmd));
assert(num_read == sizeof(cmd));

printf(" cmd=%c\n", cmd);

// generate reply
sprintf(res, "Hello from Linux, %c\n", cmd);

// send data
ssize_t num_written = write(cfd, (const void *) res, sizeof(res));
assert(num_written == sizeof(res));
}

(void) close(cfd);
(void) close(sfd);

printf("done.\n");
return 0;
}

最佳答案

很巧的是,我正在搜索 WSL GitHub issues昨天获取有关 X11 套接字的信息时,我遇到了 this issue (这与我的主题无关,但与您的主题相关),关于 WSL2 中的 AF_UNIX 支持,它引起了我的注意,只是因为它最近被关闭为按设计。 p>

简而言之,WSL2 目前不支持 AF_UNIX。如果您的应用程序可行,请考虑将 WSL 发行版转换(或复制)到 WSL1,其中支持 AF_UNIX

或者,您可以在 Windows 和 Linux 端之间使用网络连接。

关于linux - Windows WSL 以上 Linux 中的 AF_UNIX 套接字无法绑定(bind)到/mnt 文件 : error 95, 操作不支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73067135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com