Supercollider / TCP

Supercollider – when receiving messages in TCP – asks for a trailing int containing the length of the message [1]. This has been implemented like this:

QByteArray out = oscMessage( path, data );
qint32 len=out.length();
out.push_front(QOscBase::fromInt32(len));
socket()->write(out);

Sending such a message to puredata, results in an error:

unpackOSC: DataAfterAlignedString: Incorrectly padded string
unpackOSC: Bad message name string: Dropping entire message.

[1] supercollider.svn.sourceforge.net/viewvc/supercollider/trunk/common/build/Help/ServerArchitecture/Server-Architecture.html
Binary Format of Messages / a Message consists of:
using TCP :

int – the length in bytes of the following message.
one Bundle or one Command.

Cast von Klassen

Fehler:‘class QAbstractSocket’ has no member named ‘bind’

if(socket()->socketType()==QAbstractSocket::UdpSocket) {
  (QUdpSocket)(socket())->bind( QHostAddress::Any, port );
}

This way it works:

if(socket()->socketType()==QAbstractSocket::UdpSocket) {
  static_cast<QUdpSocket *>(socket())->bind( QHostAddress::Any, port );
  connect( static_cast<QUdpSocket *>(socket()), SIGNAL( readyRead() ), this, SLOT( readyRead() ) );
}

Zwischenbilanz

  • System Latenz der Netzwerkverarbeitung variert zwischen 0.3-3 ms
  • TCP
    • z.T. von Applikationen nicht unterstützt
    • Verwendung von Urgent (out of band data) / Push flag überwindet Nachteile von TCP.
    • TCP beschränkt kontrollierbar durch QT.
  • Lösungskonzept
    • UDP übertragung mit selbstgeschriebenem Client auf Empfangsseite. Nummerierung der Pakete under Verwendung von OSC-Timestamp. Vorteil: Übertragungsqualität kann von Anwendung erkannt werden.

 

Market overview

Question: Can these Products receive OSC-TCP?

Puredata

Yes, bud dumpOSC does not work, you have to use netreceive and the external OSC / unpackOSC

en.flossmanuals.net/pure-data/ch065_osc/

puredata.info/community/projects/software/osc

Reaktor

Reaktor 5.1 seems not to accept tcp connections.

Supercollider

Accepts tcp by option: start with: scsynth -t <tcp-port> -u <udp-port>

MAX/MSP (5.1.8)

Yes, via net.tcp.recv und OSC-route.

maxobjects.com/?v=objects&id_objet=2

maxobjects.com/?v=objects&id_objet=2863

Processing

Yes, via oscP5:

www.sojamo.de/libraries/oscP5/

www.sojamo.de/libraries/oscP5/examples/oscP5tcp/oscP5tcp.pde

 

 

Fehlermessung

Der Fehler ist auf folgenden 2 Schreenshots dargestellt. Während der Sender 234 Nachrichten verschickt, kommen beim Empfänger gerade mal noch 100 an. Diese Werte können den Zählern der Sende-/Empfangsapplikation entnommen werden.

Der Parallel dazu laufende Netzwerkscanner liefert auf beiden Seiten exakt die gleichen Werte.

Wir können beobachten, dass der Nachrichtenverlust mit der Paketfrequenz steigt. Bei weniger als ca. 50 Nachrichten pro Sekunde gehen diese nicht verloren.

Bild 1: Sender, der Nachrichtenzähler befindet sich unten, rechts, als rotgedruckte Debug-Info: “sent messages:   234”. Beim Sender handelt es sich um eine C++/QT4-Applikation.

Bild 2: Empfänger: Hierbei handelt es sich um einen PureData-Patch. Der Nachrichtenzähler befindet sich im Fenster rechts aussen, im untersten Feld mit dem Wert 100.

TCP options to use

Working with Out-Of-Band Data: Setting the URG-Flag. This prevents that later packets have to wait for earlier, lost ones.

send(…,,MSG_OOB)

Setting the socket to TCP_NOWAIT: This sends small amounts of data immediately, without waiting for filling one packet.

m_socket->setSocketOption(QAbstractSocket::LowDelayOption, 1);

PSH-Flag….

packetlife.net/blog/2011/mar/2/tcp-flags-psh-and-urg/

Literature:

The GNU C Library Reference Manual, Edition 0.12

www.qtcentre.org/threads/45955-SOLVED-setting-QTcpSocket-TCP_NODELAY-option

doc.qt.nokia.com/4.7/qabstractsocket.html

Besprechung Konzept mit Mentor

Bedenken Mentor: TCP kann zu hohen Latenzzeiten führen, wegen der Retransmits und Sliding Window Size.

Vorschlag Mentor: Entwickeln eines eigenen, UDP-basierten Sicherungssystems.

Hypothese Student: Probleme mit Da die OSC-Pakete tendenziell eher klein sind (~32 bytes) und die Übertragungsstrecken kurz, fallen Verzögerungen durch warten auf Retransmits wenig ins Gewicht.

Fragen:

  • Wie genau verhält sich TCP beim verschicken von vielen kleinen Datenpakete. Kann dieser durch setzen des URG-Flags (Urgent) positiv beeinflusst werden?
  • Wie kann das URG-Flag gesetzt werden?
  • Wie können Stati der TCP-Verbindung vom Code aus abgefragt werden?

Literatur:

UNIX Network Programming: The sockets networking API
By W. Richard Stevens, Bill Fenner, Andrew M. Rudoff