Получение широковещательной передачи UDP с помощью openFrameworks

Я пытаюсь получить и проанализировать пакет, отправляемый через широковещательную рассылку UDP.

Отправляющее устройство отправляет широковещательную рассылку через порт 7331.

Моя принимающая программа openframeworks основана на документации ofxUDPManager, которую можно найти здесь:

http://www.openframeworks.cc/documentation/ofxNetwork/ofxUDPManager.html

DiscoveryListener.h

class DiscoveryListener {
 public:
  DiscoveryListener();
  ~DiscoveryListener();
  void update();
  string getMessage();
 private:
  ofxUDPManager udpConnection;
  string message;
  int newMessage;
  static const int portNo = 7331;
  static const int packetSize = 76;
};

DiscoveryListener.cpp

#include "DiscoveryListener.h"

DiscoveryListener::DiscoveryListener() {
  udpConnection.Create();
  udpConnection.SetEnableBroadcast(true);
  udpConnection.BindMcast("0.0.0.0", portNo);
  udpConnection.SetNonBlocking(true);

  newMessage = 0;
}

void DiscoveryListener::update() {
  char udpMessage[packetSize];
  newMessage = udpConnection.Receive(udpMessage,packetSize);
  std::cout << "Packet size: " << newMessage << std::endl;
  printf("UDP Packet: %s", udpMessage);
}

string DiscoveryListener::getMessage() {
  if(newMessage) {
    return message;
  }
  else {
    return "No new messages.";
      }
}

ofApp.cpp

void testApp::setup(){
  listener = new DiscoveryListener();

}

//--------------------------------------------------------------
void testApp::update(){
  listener->update();
}

//--------------------------------------------------------------
void testApp::draw(){
  std::cout << "Frame Number: " << ofGetFrameNum() << std::endl;
  std::cout << "Message: " << listener->getMessage();
}

И вывод:

Packet size: -1
UDP Packet:
Packet size: -1
UDP Packet:
Packet size: 76
UDP Packet:
Packet size: -1
UDP Packet:
Packet size: -1

Таким образом, похоже, что большую часть времени возникает ошибка (размер пакета возвращает -1), а затем примерно раз в секунду (когда отправляющее устройство отправляет свою широковещательную рассылку UDP) я получаю пакет из 76 байт. Однако он не распечатывается, и я не могу найти способ его проанализировать.

Я неправильно получаю мультикаст? Или что-то не так с тем, как я печатаю массив байтов?

Большое спасибо за Вашу помощь!


person nathan lachenmyer    schedule 21.08.2014    source источник


Ответы (1)


Пакеты UDP иногда отбрасываются и не используют рукопожатие TCP. Степень отсева также зависит от трафика в вашей сети.

Часто документация oF не совсем актуальна. Я рекомендую загрузить последнюю версию (http://openframeworks.cc/download/) и основывать свою разработку на примеры, найденные в папке примеров:

https://github.com/openframeworks/openFrameworks/blob/master/examples/addons/networkUdpReceiverExample/src/ofApp.cpp

То, как вы анализируете сообщения, также зависит от терминатора, который вы выбрали для своих сообщений. ("[/p]" в примерах)

person Borg    schedule 03.10.2014