mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-18 01:15:46 +00:00
Use poll() instead of SO_RCVTIMEO for RTSP timeout support
poll() is more portable than SO_RCVTIMEO
This commit is contained in:
parent
7c346c3104
commit
c00f4e15ae
@ -77,24 +77,6 @@ int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRecvTimeout(SOCKET s, int timeoutSec) {
|
|
||||||
#ifdef __WIIU__
|
|
||||||
// timeouts aren't supported on Wii U
|
|
||||||
#else
|
|
||||||
#if defined(LC_WINDOWS)
|
|
||||||
int val = timeoutSec * 1000;
|
|
||||||
#else
|
|
||||||
struct timeval val;
|
|
||||||
val.tv_sec = timeoutSec;
|
|
||||||
val.tv_usec = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&val, sizeof(val)) < 0) {
|
|
||||||
Limelog("setsockopt(SO_RCVTIMEO) failed: %d\n", (int)LastSocketError());
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs) {
|
int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs) {
|
||||||
#if defined(LC_WINDOWS) || defined(__vita__)
|
#if defined(LC_WINDOWS) || defined(__vita__)
|
||||||
// We could have used WSAPoll() but it has some nasty bugs
|
// We could have used WSAPoll() but it has some nasty bugs
|
||||||
|
@ -99,7 +99,6 @@ int setSocketNonBlocking(SOCKET s, bool enabled);
|
|||||||
int recvUdpSocket(SOCKET s, char* buffer, int size, bool useSelect);
|
int recvUdpSocket(SOCKET s, char* buffer, int size, bool useSelect);
|
||||||
void shutdownTcpSocket(SOCKET s);
|
void shutdownTcpSocket(SOCKET s);
|
||||||
int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs);
|
int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs);
|
||||||
void setRecvTimeout(SOCKET s, int timeoutSec);
|
|
||||||
void closeSocket(SOCKET s);
|
void closeSocket(SOCKET s);
|
||||||
bool isPrivateNetworkAddress(struct sockaddr_storage* address);
|
bool isPrivateNetworkAddress(struct sockaddr_storage* address);
|
||||||
int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs);
|
int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs);
|
||||||
|
@ -248,7 +248,6 @@ static bool transactRtspMessageTcp(PRTSP_MESSAGE request, PRTSP_MESSAGE response
|
|||||||
if (sock == INVALID_SOCKET) {
|
if (sock == INVALID_SOCKET) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
setRecvTimeout(sock, RTSP_TIMEOUT_SEC);
|
|
||||||
|
|
||||||
serializedMessage = serializeRtspMessage(request, &messageLen);
|
serializedMessage = serializeRtspMessage(request, &messageLen);
|
||||||
if (serializedMessage == NULL) {
|
if (serializedMessage == NULL) {
|
||||||
@ -271,6 +270,8 @@ static bool transactRtspMessageTcp(PRTSP_MESSAGE request, PRTSP_MESSAGE response
|
|||||||
offset = 0;
|
offset = 0;
|
||||||
responseBufferSize = 0;
|
responseBufferSize = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
struct pollfd pfd;
|
||||||
|
|
||||||
if (offset >= responseBufferSize) {
|
if (offset >= responseBufferSize) {
|
||||||
responseBufferSize = offset + 16384;
|
responseBufferSize = offset + 16384;
|
||||||
responseBuffer = extendBuffer(responseBuffer, responseBufferSize);
|
responseBuffer = extendBuffer(responseBuffer, responseBufferSize);
|
||||||
@ -280,6 +281,20 @@ static bool transactRtspMessageTcp(PRTSP_MESSAGE request, PRTSP_MESSAGE response
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pfd.fd = sock;
|
||||||
|
pfd.events = POLLIN;
|
||||||
|
err = pollSockets(&pfd, 1, RTSP_TIMEOUT_SEC * 1000);
|
||||||
|
if (err == 0) {
|
||||||
|
*error = ETIMEDOUT;
|
||||||
|
Limelog("RTSP request timed out\n");
|
||||||
|
}
|
||||||
|
else if (err < 0) {
|
||||||
|
*error = LastSocketError();
|
||||||
|
Limelog("Failed to wait for RTSP response: %d\n", *error);
|
||||||
|
goto Exit;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
err = recv(sock, &responseBuffer[offset], responseBufferSize - offset, 0);
|
err = recv(sock, &responseBuffer[offset], responseBufferSize - offset, 0);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
// Error reading
|
// Error reading
|
||||||
|
Loading…
x
Reference in New Issue
Block a user