1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-02-03 03:30:06 +00:00

Add IP and Port detection option in OSCReceiver

This commit is contained in:
Ben Kuper 2024-06-22 20:09:54 +02:00
parent 61a03097ec
commit d2cf768b0a
4 changed files with 72 additions and 3 deletions

View file

@ -60,6 +60,12 @@
#pragma once
#define JUCE_OSC_H_INCLUDED
/** Config: JUCE_IP_AND_PORT_DETECTION
If enabled, this will add remoteIP and remotePort variables to osc packets, corresponding to the sender's ip and port when receiving messages.
*/
#ifndef JUCE_IP_AND_PORT_DETECTION
#define JUCE_IP_AND_PORT_DETECTION 0
#endif
#include <juce_core/juce_core.h>
#include <juce_events/juce_events.h>

View file

@ -50,6 +50,26 @@ OSCAddressPattern OSCMessage::getAddressPattern() const noexcept
return addressPattern;
}
#if JUCE_IP_AND_PORT_DETECTION
String OSCMessage::getSenderIPAddress() const noexcept
{
return senderIPAddress;
}
void OSCMessage::setSenderIPAddress(const String& ip) noexcept
{
senderIPAddress = ip;
}
int OSCMessage::getSenderPortNumber() const noexcept
{
return senderPortNumber;
}
void OSCMessage::setSenderPortNumber(int port) noexcept
{
senderPortNumber = port;
}
#endif
//==============================================================================
int OSCMessage::size() const noexcept
{

View file

@ -91,6 +91,16 @@ public:
/** Returns the address pattern of the OSCMessage. */
OSCAddressPattern getAddressPattern() const noexcept;
#if JUCE_IP_AND_PORT_DETECTION
/** Returns the sender's IP Address. */
String getSenderIPAddress() const noexcept;
void setSenderIPAddress(const String& ip) noexcept;
/** Returns the sender's port number. */
int getSenderPortNumber() const noexcept;
void setSenderPortNumber(int port) noexcept;
#endif
/** Returns the number of OSCArgument objects that belong to this OSCMessage. */
int size() const noexcept;
@ -178,6 +188,11 @@ private:
//==============================================================================
OSCAddressPattern addressPattern;
Array<OSCArgument> arguments;
#if JUCE_IP_AND_PORT_DETECTION
String senderIPAddress;
int senderPortNumber = 0;
#endif
};

View file

@ -56,9 +56,18 @@ namespace
@param sourceData the block of data to use as the stream's source
@param sourceDataSize the number of bytes in the source data block
*/
#if JUCE_IP_AND_PORT_DETECTION
OSCInputStream (const void* sourceData, size_t sourceDataSize, const String& senderIPAddress, const int& senderPortNumber) :
input(sourceData, sourceDataSize, false),
senderIPAddress(senderIPAddress),
senderPortNumber(senderPortNumber)
{}
#else
OSCInputStream (const void* sourceData, size_t sourceDataSize)
: input (sourceData, sourceDataSize, false)
{}
#endif
//==============================================================================
/** Returns a pointer to the source data block from which this stream is reading. */
@ -273,6 +282,11 @@ namespace
private:
MemoryInputStream input;
#if JUCE_IP_AND_PORT_DETECTION
String senderIPAddress;
int senderPortNumber;
#endif
//==============================================================================
void readPaddingZeros (size_t bytesRead)
{
@ -427,10 +441,15 @@ struct OSCReceiver::Pimpl : private Thread,
};
//==============================================================================
void handleBuffer (const char* data, size_t dataSize)
#if JUCE_IP_AND_PORT_DETECTION
void handleBuffer(const char* data, size_t dataSize, const String& senderIPAddress, const int& senderPortNumber)
{
OSCInputStream inStream (data, dataSize);
OSCInputStream inStream(data, dataSize, senderIPAddress, senderPortNumber);
#else
void handleBuffer(const char* data, size_t dataSize)
{
OSCInputStream inStream(data, dataSize);
#endif
try
{
auto content = inStream.readElementWithKnownSize (dataSize);
@ -477,10 +496,19 @@ private:
if (ready == 0)
continue;
#if JUCE_IP_AND_PORT_DETECTION
String senderIPAddress = "";
int senderPortNumber = 0;
auto bytesRead = (size_t) socket->read (oscBuffer.getData(), bufferSize, false, senderIPAddress, senderPortNumber);
if (bytesRead >= 4)
handleBuffer(oscBuffer.getData(), bytesRead, senderIPAddress, senderPortNumber);
#else
auto bytesRead = (size_t) socket->read (oscBuffer.getData(), bufferSize, false);
if (bytesRead >= 4)
handleBuffer (oscBuffer.getData(), bytesRead);
#endif
}
}