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)、もう 1 つインクルードする必要があることがわかりました。

#include <unistd.h>

しかし、実行が成功した後、「バインド: 操作は許可されていません」というメッセージが表示されます。なにが問題ですか?ルートで実行しようとしましたが、まだ機能していません。

4

2 に答える 2

3

一部の Unix システムでは、どこにでもソケットを作成することはできません。適切なアクセス許可と、その下にある適切なファイル システムがあることを確認してください。(携帯電話の SD カードで使用される Fat32 は、ファイルへの追加フラグを許可しないため、問題が発生する可能性があります) 最後に、新しいシステムでは、ソケットの作成をブロックする可能性のある selinux などのセキュリティ機能が実行されています。

私の例では、変更する必要がありました

#define SOCK_PATH "echo_socket"

#define SOCK_PATH "/dev/socket/echo_socket"

その後、すぐに機能しました。(ルート シェルで起動された実行可能ファイル)

于 2014-08-05T10:10:14.397 に答える
1

無許可なので。できます #define SOCK_PATH "/home/username/echo_socket" し、正常に実行されます。

于 2016-01-11T07:37:39.397 に答える