2017-02-07 4 views
1

QLocalServerオブジェクトをunix抽象ソケットにリッスンすることはできますか? 私はqt5 docsで述べたような可能性を見ていない、そこだけ名前付きパイプが言及されていますQt5 QLocalServerを抽象的なUNIXソケットにリッスンさせる方法はありますか?

は通常あなただけの「foo」というような名前を渡すだろうが、Unixでは、これはまたのようなパスである可能性」/tmp/foo」というWindows上とは、これが管路などの可能性があり、 『\。\パイプ\ fooの』

だから私は自分のソケットを作成し、QLocalServerオブジェクトはそれに耳を傾けるにする必要がありますか?

int sockfd = ... // a lot of work 
QLocalServer *srv = new QLocalServer(this); 
srv->listen(static_cast<qintptr>(&sockfd)); // bad code 

Qtアブストラクトがどのように提供され、どれくらいの可能性があるかを知っているのは間違いです。

+0

それは私にとって非常にはっきりしていないあなたが実際にしようとしているもの達成する。 'QLocalServer'は提供していないことをあなたがしたいことは何ですか?私が何かを見逃してしまったら、すみません。 –

+0

@ G.M。私は、ファイルシステムエンティティである名前付きパイプではなく、UNIX抽象ソケットを聴かせたいと思っています。 Unix抽象ソケットはFSにはまったく関係がありません。カーネルエンティティのみです。詳細については、この情報を他の場所で見つけようとしてください。 –

+0

申し訳ありませんが、あなたの投稿を誤解しました。しかし、いいえ。 'QLocalServer'ソースを見ると、あたかも抽象ソケット型のための準備ができているかのようには見えません。実際、「qlocalserver + abstract + socket + unix」を検索すると、この機能と[this](https://gitlab.com/pteam/pteam-qtbase/commit/980947122307797e1d8da03f768d8f14a360d20b)を要求するいくつかのバグが表示されます。 –

答えて

0

私はまだコメントできません、申し訳ありません。 私はよく分かりませんが、ソケットの使用がまっすぐで、FSの配管ではなく、QUdpSocketを使用する方法があるかもしれません。

事は、あなたが入ってくるデータグラムを処理することによって、サーバーを作成することができ、次のとおりです。

void Server::initSocket() 
{ 
    udpSocket = new QUdpSocket(this); 
    udpSocket->bind(QHostAddress::LocalHost, 7755); 

    connect(udpSocket, SIGNAL(readyRead()), 
      this, SLOT(readPendingDatagrams())); 
} 

void Server::readPendingDatagrams() 
{ 
    while (udpSocket->hasPendingDatagrams()) { 
     QByteArray datagram; 
     datagram.resize(udpSocket->pendingDatagramSize()); 
     QHostAddress sender; 
     quint16 senderPort; 

     udpSocket->readDatagram(datagram.data(), datagram.size(), 
           &sender, &senderPort); 

     processTheDatagram(datagram); 
    } 
} 

その後、あなたはあなたがしたいアクションを行うためにprocessTheDatagram(QByteArray datagram)にデータグラム情報を使用することができます。

私はそれが役に立ちそうです。

1

あなたはすでにこれを解決しているかもしれませんが、念のために... QLocalServer::listenを手動で設定するソケット記述子を渡すことは少し奇妙に思えたが失敗していること

事実は、私はQtのソースでより密接に少し見えました。問題は、渡されたパラメータタイプとしてqintptrを使用すると、誤解を招くことになります。コードを見ると、qintptrの値はソケット記述子として扱われ、名前が示唆するようにソケット記述子へのポインタではありません。

ので、変更してみてください...

srv->listen(static_cast<qintptr>(&sockfd)); 

に...

srv->listen(sockfd); 

、それは問題を修正かどうかを確認します。

(注:私はAF_UNIX + SOCK_STREAMソケットに上記の修正を使用して、いくつかのテストコードを書いてきたし、すべてが期待通りに動作しているように見えます。)

関連する問題