1

Poco ライブラリを使い始めたばかりです。Poco の DatagramSocket オブジェクトを使用して 2 台のコンピューターが通信する際に問題が発生しています。具体的には、 receiveBytes 関数が返されないようです (Wireshark を実行し、送信している UDP パケットが宛先マシンに到着していることを確認しているにもかかわらず)。簡単なことを省略していると思いますが、これはすべて私の愚かな間違いによるものです。Visual Studio Express 2010 を使用して、Windows 7 で Poco 1.4.3p1 をコンパイルしました。以下は、Poco の使用方法を示すコード スニペットです。アドバイスをいただければ幸いです。

送信

#include "Poco\Net\DatagramSocket.h"
#include "Serializer.h" //A library used for serializing data

int main()
{
   Poco::Net::SocketAddress remoteAddr("192.168.1.140", 5678); //The IP address of the remote (receiving) machine
   Poco::Net::DatagramSocket mSock; //We make our socket (its not connected currently)
   mSock.connect(remoteAddr); //Sends/Receives are restricted to the inputted IPAddress and port
   unsigned char float_bytes[4];
   FloatToBin(1234.5678, float_bytes); //Serializing the float and storing it in float_bytes
   mSock.sendBytes((void*)float_bytes, 4); //Bytes AWAY!
   return 0;
}

受信 (問題がある場合)

#include "Poco\Net\DatagramSocket.h"
#include "Poco\Net\SocketAddress.h"
#include "Serializer.h"
#include <iostream>

int main()
{
   Poco::Net::SocketAddress remoteAddr("192.168.1.116", 5678); //The IP address of the remote (sending) machine
   Poco::Net::DatagramSocket mSock; //We make our socket (its not connected currently)
   mSock.connect(remoteAddr); //Sends/Receives are restricted to the inputted IPAddress and port
   //Now lets try to get some datas
   std::cout << "Waiting for float" << std::endl;
   unsigned char float_bytes[4];
   mSock.receiveBytes((void*)float_bytes, 4); //The code is stuck here waiting for a packet. It never returns...
   //Finally, lets convert it to a float and print to the screen
   float net_float;
   BinToFloat(float_bytes, &net_float); //Converting the binary data to a float and storing it in net_float
   std::cout << net_float << std::endl;
   system("PAUSE");
   return 0;
}

お時間をいただきありがとうございます。

4

1 に答える 1

3

POCO ソケットは、Berkeley ソケットをモデルにしています。Berkeley ソケット API に関する基本的なチュートリアルを読むと、POCO OOP ソケットの抽象化を理解しやすくなります。

クライアントとサーバーの両方で connect() することはできません。クライアントでのみ connect() します。UDP では、connect() はオプションであり、スキップできます (その場合、SendBytes() の代わりに sendTo() を使用する必要があります)。

サーバーでは、ワイルドカード IP アドレス (つまり、ホスト上の利用可能なすべてのネットワーク インターフェイスで受信する) で bind() するか、特定の IP アドレス (つまり、その IP アドレスでのみ受信します) に bind() します。

レシーバー/サーバー コードを見ると、リモート クライアントのアドレスをフィルター処理する必要があるようです。connect() でそれを行うことはできません。 receiveFrom(buffer, length, address) で読み取ってから、「アドレス」で自分自身をフィルタリングする必要があります。

セキュリティに関しては、受信する UDP パケットの送信元アドレスで行う仮定に注意してください。UDP パケットのスプーフィングは簡単です。別の言い方をすれば、IP アドレス (または適切な暗号化によって保護されていないもの) に基づいて認証または承認の決定を下さないでください。

POCO プレゼンテーションhttp://pocoproject.org/slides/200-Network.pdfでは、コード スニペットを使用して、POCO を使用してネットワーク プログラミングを行う方法について説明しています。DatagramSocket については、スライド 15、16 を参照してください。スライド 15 にタイプミスがあることに注意してください。msg.data()、msg.size() を syslogMsg.data()、syslogMsg.size() に置き換えてコンパイルしてください :-)

POCO を使用する際のベスト プラクティスも示す短い例については、「poco/net/samples」ディレクトリも参照してください。

于 2012-05-21T13:11:03.077 に答える