diff --git a/src/Connection.c b/src/Connection.c index fd5776b..bac9a6e 100644 --- a/src/Connection.c +++ b/src/Connection.c @@ -381,7 +381,7 @@ int LiStartConnection(PSERVER_INFORMATION serverInfo, PSTREAM_CONFIGURATION stre // Resolve LocalAddr by RemoteAddr. { SOCKADDR_LEN localAddrLen; - err = getLocalAddressByUdpConnect(&RemoteAddr, AddrLen, &LocalAddr, &localAddrLen); + err = getLocalAddressByUdpConnect(&RemoteAddr, AddrLen, RtspPortNumber, &LocalAddr, &localAddrLen); if (err != 0) { Limelog("failed to resolve local addr: %d\n", err); ListenerCallbacks.stageFailed(STAGE_NAME_RESOLUTION, err); diff --git a/src/PlatformSockets.c b/src/PlatformSockets.c index 8468b82..41e7dd8 100644 --- a/src/PlatformSockets.c +++ b/src/PlatformSockets.c @@ -568,16 +568,22 @@ Exit: return s; } -int getLocalAddressByUdpConnect(const struct sockaddr_storage* targetAddr, SOCKADDR_LEN targetAddrLen, - struct sockaddr_storage* localAddr, SOCKADDR_LEN* localAddrLen) { +int getLocalAddressByUdpConnect(const struct sockaddr_storage* targetAddr, SOCKADDR_LEN targetAddrLen, unsigned short targetPort, + struct sockaddr_storage* localAddr, SOCKADDR_LEN* localAddrLen) { SOCKET udpSocket; + LC_SOCKADDR connAddr; + + LC_ASSERT(targetPort != 0); udpSocket = createSocket(targetAddr->ss_family, SOCK_DGRAM, IPPROTO_UDP, false); if (udpSocket == INVALID_SOCKET) { return LastSocketError(); } - if (connect(udpSocket, (struct sockaddr*)targetAddr, targetAddrLen) < 0) { + memcpy(&connAddr, targetAddr, targetAddrLen); + SET_PORT(&connAddr, RtspPortNumber); + + if (connect(udpSocket, (struct sockaddr*)&connAddr, targetAddrLen) < 0) { int err = LastSocketError(); Limelog("UDP connect() failed: %d\n", err); closeSocket(udpSocket); diff --git a/src/PlatformSockets.h b/src/PlatformSockets.h index 930f461..db47d83 100644 --- a/src/PlatformSockets.h +++ b/src/PlatformSockets.h @@ -107,8 +107,8 @@ void addrToUrlSafeString(struct sockaddr_storage* addr, char* string, size_t str SOCKET createSocket(int addressFamily, int socketType, int protocol, bool nonBlocking); SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec); -int getLocalAddressByUdpConnect(const struct sockaddr_storage* targetAddr, SOCKADDR_LEN targetAddrLen, - struct sockaddr_storage* localAddr, SOCKADDR_LEN* localAddrLen); +int getLocalAddressByUdpConnect(const struct sockaddr_storage* targetAddr, SOCKADDR_LEN targetAddrLen, unsigned short targetPort, + struct sockaddr_storage* localAddr, SOCKADDR_LEN* localAddrLen); int sendMtuSafe(SOCKET s, char* buffer, int size); SOCKET bindUdpSocket(int addressFamily, struct sockaddr_storage* localAddr, SOCKADDR_LEN addrLen, int bufferSize, int socketQosType); int enableNoDelay(SOCKET s);