Browse Source

Fix for IPV6 sockets.

tags/2021-05-28
jules 13 years ago
parent
commit
baee94b197
1 changed files with 21 additions and 24 deletions
  1. +21
    -24
      modules/juce_core/network/juce_Socket.cpp

+ 21
- 24
modules/juce_core/network/juce_Socket.cpp View File

@@ -196,7 +196,7 @@ namespace SocketHelpers
bool connectSocket (int volatile& handle, bool connectSocket (int volatile& handle,
const bool isDatagram, const bool isDatagram,
void** serverAddress,
struct addrinfo** const serverAddress,
const String& hostName, const String& hostName,
const int portNumber, const int portNumber,
const int timeOutMillisecs) noexcept const int timeOutMillisecs) noexcept
@@ -207,7 +207,8 @@ namespace SocketHelpers
hints.ai_flags = AI_NUMERICSERV; hints.ai_flags = AI_NUMERICSERV;
struct addrinfo* info = nullptr; struct addrinfo* info = nullptr;
if (getaddrinfo (hostName.toUTF8(), String (portNumber).toUTF8(), &hints, &info) != 0 || info == 0)
if (getaddrinfo (hostName.toUTF8(), String (portNumber).toUTF8(), &hints, &info) != 0
|| info == nullptr)
return false; return false;
if (handle < 0) if (handle < 0)
@@ -221,11 +222,10 @@ namespace SocketHelpers
if (isDatagram) if (isDatagram)
{ {
struct sockaddr* s = new struct sockaddr();
*s = *(info->ai_addr);
*serverAddress = s;
if (*serverAddress != nullptr)
freeaddrinfo (*serverAddress);
freeaddrinfo (info);
*serverAddress = info;
return true; return true;
} }
@@ -341,7 +341,7 @@ bool StreamingSocket::connect (const String& remoteHostName,
portNumber = remotePortNumber; portNumber = remotePortNumber;
isListener = false; isListener = false;
connected = SocketHelpers::connectSocket (handle, false, 0, remoteHostName,
connected = SocketHelpers::connectSocket (handle, false, nullptr, remoteHostName,
remotePortNumber, timeOutMillisecs); remotePortNumber, timeOutMillisecs);
if (! (connected && SocketHelpers::resetSocketOptions (handle, false, false))) if (! (connected && SocketHelpers::resetSocketOptions (handle, false, false)))
@@ -428,9 +428,9 @@ StreamingSocket* StreamingSocket::waitForNextConnection() const
if (connected && isListener) if (connected && isListener)
{ {
struct sockaddr address;
juce_socklen_t len = sizeof (sockaddr);
const int newSocket = (int) accept (handle, &address, &len);
struct sockaddr_storage address;
juce_socklen_t len = sizeof (address);
const int newSocket = (int) accept (handle, (struct sockaddr*) &address, &len);
if (newSocket >= 0 && connected) if (newSocket >= 0 && connected)
return new StreamingSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr), return new StreamingSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr),
@@ -453,7 +453,7 @@ DatagramSocket::DatagramSocket (const int localPortNumber, const bool allowBroad
handle (-1), handle (-1),
connected (true), connected (true),
allowBroadcast (allowBroadcast_), allowBroadcast (allowBroadcast_),
serverAddress (0)
serverAddress (nullptr)
{ {
SocketHelpers::initSockets(); SocketHelpers::initSockets();
@@ -468,7 +468,7 @@ DatagramSocket::DatagramSocket (const String& hostName_, const int portNumber_,
handle (handle_), handle (handle_),
connected (true), connected (true),
allowBroadcast (false), allowBroadcast (false),
serverAddress (0)
serverAddress (nullptr)
{ {
SocketHelpers::initSockets(); SocketHelpers::initSockets();
@@ -480,8 +480,8 @@ DatagramSocket::~DatagramSocket()
{ {
close(); close();
delete static_cast <struct sockaddr*> (serverAddress);
serverAddress = 0;
if (serverAddress != nullptr)
freeaddrinfo (static_cast <struct addrinfo*> (serverAddress));
} }
void DatagramSocket::close() void DatagramSocket::close()
@@ -514,7 +514,7 @@ bool DatagramSocket::connect (const String& remoteHostName,
hostName = remoteHostName; hostName = remoteHostName;
portNumber = remotePortNumber; portNumber = remotePortNumber;
connected = SocketHelpers::connectSocket (handle, true, &serverAddress,
connected = SocketHelpers::connectSocket (handle, true, (struct addrinfo**) &serverAddress,
remoteHostName, remotePortNumber, remoteHostName, remotePortNumber,
timeOutMillisecs); timeOutMillisecs);
@@ -529,19 +529,16 @@ bool DatagramSocket::connect (const String& remoteHostName,
DatagramSocket* DatagramSocket::waitForNextConnection() const DatagramSocket* DatagramSocket::waitForNextConnection() const
{ {
struct sockaddr address;
juce_socklen_t len = sizeof (sockaddr);
while (waitUntilReady (true, -1) == 1) while (waitUntilReady (true, -1) == 1)
{ {
struct sockaddr_storage address;
juce_socklen_t len = sizeof (address);
char buf[1]; char buf[1];
if (recvfrom (handle, buf, 0, 0, &address, &len) > 0)
{
if (recvfrom (handle, buf, 0, 0, (struct sockaddr*) &address, &len) > 0)
return new DatagramSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr), return new DatagramSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr),
ntohs (((struct sockaddr_in*) &address)->sin_port), ntohs (((struct sockaddr_in*) &address)->sin_port),
-1, -1); -1, -1);
}
} }
return nullptr; return nullptr;
@@ -564,12 +561,12 @@ int DatagramSocket::read (void* destBuffer, const int maxBytesToRead, const bool
int DatagramSocket::write (const void* sourceBuffer, const int numBytesToWrite) int DatagramSocket::write (const void* sourceBuffer, const int numBytesToWrite)
{ {
// You need to call connect() first to set the server address.. // You need to call connect() first to set the server address..
jassert (serverAddress != 0 && connected);
jassert (serverAddress != nullptr && connected);
return connected ? (int) sendto (handle, (const char*) sourceBuffer, return connected ? (int) sendto (handle, (const char*) sourceBuffer,
numBytesToWrite, 0, numBytesToWrite, 0,
(const struct sockaddr*) serverAddress,
sizeof (struct sockaddr_in))
static_cast <const struct addrinfo*> (serverAddress)->ai_addr,
static_cast <const struct addrinfo*> (serverAddress)->ai_addrlen)
: -1; : -1;
} }


Loading…
Cancel
Save