これは私が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
を追加します。
私はそれが問題だと思った!私はマニュアルページから正しくしましたが、私がここを見て私の決定に戻りました。http://beej.us/guide/bgipc/output/html/multipage/unixsock.htmlそして著者は私が使った長さを使っているようでした上のコードスニペットで! – Curious
@Curious私は、コードはおそらくプラットフォーム固有の動作に依存していると思われ、いくつかの実装でうまくいくかもしれません。私の提案は問題を解決しましたか? – user2079303
そうでした!私は別の質問がありましたが、すぐに別の質問としてそれを尋ねると思います。ありがとう! – Curious