mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2026-02-16 02:21:07 +00:00
Use a valid port when calling connect() for local address detection
BSDs (including Darwin) don't like using port 0.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -568,16 +568,22 @@ Exit:
|
||||
return s;
|
||||
}
|
||||
|
||||
int getLocalAddressByUdpConnect(const struct sockaddr_storage* targetAddr, SOCKADDR_LEN targetAddrLen,
|
||||
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);
|
||||
|
||||
@@ -107,7 +107,7 @@ 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,
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user