2017-02-14 3 views
0

私は静脈4.4を使用している方へ静脈内UDPの接続を開くと、私は外側サーバーにいくつかの結果を格納する必要があるので、私はそれに向けてUDP接続を開きたいです。は、外部サーバ

私は静脈のモビリティのためのTCP接続を使用してについて、いくつかの記事を読んだ、と私は、接続を開くためにInetのモジュールに頼る必要があります理解していました。 私はモビリティのためにそれを必要としませんが、外部のサーバーにデータを送信します。

提案はありますか?

私はメソッドを使用しようとしていたprocessCommandFromApp方法INETから/​​ SRC /輸送/ UDP.ccクラス:次のように私はINETパスを含ま

void UDP::processCommandFromApp(cMessage *msg) 
{ 
    switch (msg->getKind()) 
    { 
     case UDP_C_BIND: { 
      UDPBindCommand *ctrl = check_and_cast<UDPBindCommand*>(msg->getControlInfo()); 
      bind(ctrl->getSockId(), msg->getArrivalGate()->getIndex(), ctrl->getLocalAddr(), ctrl->getLocalPort()); 
      break; 
     } 
     case UDP_C_CONNECT: { 
      UDPConnectCommand *ctrl = check_and_cast<UDPConnectCommand*>(msg->getControlInfo()); 
      connect(ctrl->getSockId(), msg->getArrivalGate()->getIndex(), ctrl->getRemoteAddr(), ctrl->getRemotePort()); 
      break; 
     } 
     case UDP_C_CLOSE: { 
      UDPCloseCommand *ctrl = check_and_cast<UDPCloseCommand*>(msg->getControlInfo()); 
      close(ctrl->getSockId()); 
      break; 
     } 
     case UDP_C_SETOPTION: { 
      UDPSetOptionCommand *ctrl = check_and_cast<UDPSetOptionCommand *>(msg->getControlInfo()); 
      SockDesc *sd = getOrCreateSocket(ctrl->getSockId(), msg->getArrivalGate()->getIndex()); 

      if (dynamic_cast<UDPSetTimeToLiveCommand*>(ctrl)) 
       setTimeToLive(sd, ((UDPSetTimeToLiveCommand*)ctrl)->getTtl()); 
      else if (dynamic_cast<UDPSetTypeOfServiceCommand*>(ctrl)) 
       setTypeOfService(sd, ((UDPSetTypeOfServiceCommand*)ctrl)->getTos()); 
      else if (dynamic_cast<UDPSetBroadcastCommand*>(ctrl)) 
       setBroadcast(sd, ((UDPSetBroadcastCommand*)ctrl)->getBroadcast()); 
      else if (dynamic_cast<UDPSetMulticastInterfaceCommand*>(ctrl)) 
       setMulticastOutputInterface(sd, ((UDPSetMulticastInterfaceCommand*)ctrl)->getInterfaceId()); 
      else if (dynamic_cast<UDPSetMulticastLoopCommand*>(ctrl)) 
       setMulticastLoop(sd, ((UDPSetMulticastLoopCommand*)ctrl)->getLoop()); 
      else if (dynamic_cast<UDPSetReuseAddressCommand*>(ctrl)) 
       setReuseAddress(sd, ((UDPSetReuseAddressCommand*)ctrl)->getReuseAddress()); 
      else if (dynamic_cast<UDPJoinMulticastGroupsCommand*>(ctrl)) 
      { 
       UDPJoinMulticastGroupsCommand *cmd = (UDPJoinMulticastGroupsCommand*)ctrl; 
       std::vector<IPvXAddress> addresses; 
       std::vector<int> interfaceIds; 
       for (int i = 0; i < (int)cmd->getMulticastAddrArraySize(); i++) 
        addresses.push_back(cmd->getMulticastAddr(i)); 
       for (int i = 0; i < (int)cmd->getInterfaceIdArraySize(); i++) 
        interfaceIds.push_back(cmd->getInterfaceId(i)); 
       joinMulticastGroups(sd, addresses, interfaceIds); 
      } 
      else if (dynamic_cast<UDPLeaveMulticastGroupsCommand*>(ctrl)) 
      { 
       UDPLeaveMulticastGroupsCommand *cmd = (UDPLeaveMulticastGroupsCommand*)ctrl; 
       std::vector<IPvXAddress> addresses; 
       for (int i = 0; i < (int)cmd->getMulticastAddrArraySize(); i++) 
        addresses.push_back(cmd->getMulticastAddr(i)); 
       leaveMulticastGroups(sd, addresses); 
      } 
      else 
       throw cRuntimeError("Unknown subclass of UDPSetOptionCommand received from app: %s", ctrl->getClassName()); 
      break; 
     } 
     default: { 
      throw cRuntimeError("Unknown command code (message kind) %d received from app", msg->getKind()); 
     } 
    } 

    delete msg; // also deletes control info in it 
} 

#include <inet/src/transport/udp/UDP.h> 

入力UDP_C_CONNECTメッセージとして渡すことにより、次のように私はそれを呼び出す:。

cMessage *UDP_C_CONNECT; 
void Inet::UDP::processCommandFromApp(UDP_C_CONNECT); 

しかし、私は、シミュレーションを実行すると、それはこのエラーを返す、クラッシュ:

Errors occurred during the build. 
Errors running builder 'OMNeT++ Makefile Builder' on project 'veins'. 
java.lang.NullPointerException 

1)があり、必要な接続を設定するための正しい方法は何ですか?

2)なぜinetパスを含めるとすぐにこのエラーが表示されるのですか?

UPDATE 私はまた、接続を確立するための別の方法を試してみました:

std::string host; 
host = "16777343"; 
int port = 5144; 
Veins::TraCIConnection* connection; 
connection = TraCIConnection::connect(host.c_str(), port); 

しかし、すぐにそれがプラグインを読み込むと、それはの生成を開始することなく、時間0.0で何かを待っているように、それはですノード。 ありがとうございました

+0

あなたは* *サーバーへの接続をシミュレートするか、物理的にネットワーク上のコンピュータに連絡することを目指していますか?あなたの質問はこれではっきりしていないし、あなたは両方のミックスを試みたようだ。 –

+0

@ChristophSommer収集したデータをVeinsからコンピュータのサーバーに転送する必要があります。 – moi

答えて

1

OMNeT ++を使用したシミュレーションはC++プログラムであるため、あらゆるC++プログラムで使用できるライブラリとシステムコールの全範囲を使用できます。あなたのネットワーク上の他のコンピュータへのUDP接続を開こうとするならば、C++プログラムと同じようにUDPソケットを作成し、必要なときにいつでもデータを送信してください。たぶん

これを書いについて移動する最も簡単な方法は、OMNeT ++
  • 移動、他のすべての前に実行する必要があり、プログラムの一部とは何の関係もないプレーンなC++プログラムと

    • 開始することですあなたのシミュレーションのモジュールのinitializeメソッドに、残りをhandleMessageメソッドに置き換えます。
  • 関連する問題