2016-05-03 8 views
1

これは私がUnixソケットでプログラミングしている初めてのことですので、愚かなエラーは許されません。私はUNIXソケットを作成するために以下の関数を書いた。UNIXソケットのファイル名エラー

int create_server_unix_socket(const string& socket_path) { 

    // STEP 1 : socket() 
    int unix_socket = socket(AF_UNIX, SOCK_STREAM, 0); 
    if (unix_socket == -1) { 
     throw std::runtime_error {"Error occured in socket() call : "s + 
      string(std::strerror(errno))}; 
    } 

    // STEP 2 : bind(), setup the address structures for bind() 
    sockaddr_un local_address; 
    local_address.sun_family = AF_UNIX; 
    std::strcpy(local_address.sun_path, socket_path.c_str()); 

    // unlink from before 
    unlink(socket_path.c_str()); 

    // STEP 2 : bind() 
    size_t length = socket_path.size() + sizeof(local_address.sun_family); 
    if (::bind(unix_socket, reinterpret_cast<sockaddr*>(&local_address), 
       length) == -1) { 
     throw std::runtime_error {"Error occured in bind() call : "s + 
      string(strerror(errno))}; 
    } 

    // STEP 3 : listen() 
    if (listen(unix_socket, 5) == -1) { 
     throw std::runtime_error {"Error occured in listen() call : "s + 
      string(strerror(errno))}; 
    } 

    return unix_socket; 
} 

しかし、私は試してみて、現在の作業ディレクトリに作成されたファイルがunix_socke代わりのunix_socketで、実際にはこれは私がしようと、任意の名前に起こるので

create_server_unix_socket("./unix_socket"s); 

のようなソケットを作成するとき。私がunix_socket_longer_nameを試してみると、生成されるファイルはunix_socket_longer_namです。私はこれをMac OS X(バージョン10.11.4)で実行しています。

私が間違っていることに関するアイデアはありますか?また、私のコードで何かがひどく間違っていることに気がついたら、教えてください!私はマニュアルページを参考にしてこれを書きました。ありがとう!

:私はこれをC++ 14でコンパイルしています。この作業を行うには、std::literals::string_literals名前空間をインポートする必要があります。コードの先頭にusing namespace std::literals::string_literalsを追加します。

答えて

2

のは、第三のパラメータはaddrlen

addrlenが尖っアドレス構造体のサイズをバイト単位で指定されbind

int bind(int sockfd, const struct sockaddr *addr, 
      socklen_t addrlen); 

のmanページを見てみましょう〜によってaddr

したがって、渡す必要があるのはsizeof local_addressです。代わりに、あなたはになりました。これはsocket_path.size() + sizeof(local_address.sun_family)です。そのサイズはほぼ十分ですが、ヌルターミネータの余裕がなく、sockaddr_unにパディングが含まれている可能性は無視されます。

length = offsetof(sockaddr_un, sun_path) + socket_path.size() + 1; 

しかし、私は単にsizeof local_addressを渡すことに利点を超える表示されていない:あなたは本当にlocal_addressのフルサイズではなく、パスと一致する長さを渡したい場合は

、あなたはoffsetof使用することができます。

+0

私はそれが問題だと思った!私はマニュアルページから正しくしましたが、私がここを見て私の決定に戻りました。http://beej.us/guide/bgipc/output/html/multipage/unixsock.htmlそして著者は私が使った長さを使っているようでした上のコードスニペットで! – Curious

+1

@Curious私は、コードはおそらくプラットフォーム固有の動作に依存していると思われ、いくつかの実装でうまくいくかもしれません。私の提案は問題を解決しましたか? – user2079303

+0

そうでした!私は別の質問がありましたが、すぐに別の質問としてそれを尋ねると思います。ありがとう! – Curious

関連する問題