5

我是新手,刚刚在 linux 下使用 c++ 迈出了第一步。所以我有一些关于套接字的任务。我正在遵循指南,尤其是这个指南。并且代码示例不起作用。我从这个开始:

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

#define SOCK_PATH "echo_socket"

int main(void)
{
    int s, s2, t, len;
    struct sockaddr_un local, remote;
    char str[100];

    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, SOCK_PATH);
    unlink(local.sun_path);
    len = strlen(local.sun_path) + sizeof(local.sun_family);
    if (bind(s, (struct sockaddr *)&local, len) == -1) {
        perror("bind");
        exit(1);
    }
return 0;
}

我发现要编译它(Code::Blocks),还必须包含以下内容:

#include <unistd.h>

但成功运行后,我收到消息“绑定:不允许操作”。怎么了?我试图在root下运行它,但它仍然无法正常工作。

4

2 回答 2

3

某些 Unix 系统不允许您在任何地方创建套接字。确保您拥有正确的权限和正确的文件系统。(在手机的 sdcard 上使用的 Fat32 不允许在文件中添加额外的标志,这可能会给您带来麻烦)最后,在较新的系统上,运行类似 selinux 的安全设备可能会阻止套接字的创建。

在我的例子中,我不得不改变

#define SOCK_PATH "echo_socket"

#define SOCK_PATH "/dev/socket/echo_socket"

之后它立即起作用。(可执行文件在 root shell 中启动)

于 2014-08-05T10:10:14.397 回答
1

因为没有权限。你可以 #define SOCK_PATH "/home/username/echo_socket" ,它会正常运行。

于 2016-01-11T07:37:39.397 回答