mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-18 09:25:49 +00:00
Add a shutdown function for UDP sockets
This commit is contained in:
parent
e5a6297d30
commit
167d344e39
@ -255,8 +255,7 @@ void stopAudioStream(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rtpSocket != INVALID_SOCKET) {
|
if (rtpSocket != INVALID_SOCKET) {
|
||||||
closeSocket(rtpSocket);
|
shutdownUdpSocket(rtpSocket);
|
||||||
rtpSocket = INVALID_SOCKET;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PltJoinThread(&udpPingThread);
|
PltJoinThread(&udpPingThread);
|
||||||
@ -271,6 +270,11 @@ void stopAudioStream(void) {
|
|||||||
PltCloseThread(&decoderThread);
|
PltCloseThread(&decoderThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rtpSocket != INVALID_SOCKET) {
|
||||||
|
closeSocket(rtpSocket);
|
||||||
|
rtpSocket = INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
|
||||||
AudioCallbacks.cleanup();
|
AudioCallbacks.cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,7 +393,7 @@ int stopControlStream(void) {
|
|||||||
PltSetEvent(&invalidateRefFramesEvent);
|
PltSetEvent(&invalidateRefFramesEvent);
|
||||||
|
|
||||||
if (ctlSock != INVALID_SOCKET) {
|
if (ctlSock != INVALID_SOCKET) {
|
||||||
shutdownSocket(ctlSock);
|
shutdownTcpSocket(ctlSock);
|
||||||
}
|
}
|
||||||
|
|
||||||
PltInterruptThread(&lossStatsThread);
|
PltInterruptThread(&lossStatsThread);
|
||||||
|
@ -294,7 +294,7 @@ int stopInputStream(void) {
|
|||||||
PltInterruptThread(&inputSendThread);
|
PltInterruptThread(&inputSendThread);
|
||||||
|
|
||||||
if (inputSock != INVALID_SOCKET) {
|
if (inputSock != INVALID_SOCKET) {
|
||||||
shutdownSocket(inputSock);
|
shutdownTcpSocket(inputSock);
|
||||||
}
|
}
|
||||||
|
|
||||||
PltJoinThread(&inputSendThread);
|
PltJoinThread(&inputSendThread);
|
||||||
|
@ -21,12 +21,31 @@ void addrToUrlSafeString(struct sockaddr_storage* addr, char* string)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void shutdownSocket(SOCKET s) {
|
void shutdownTcpSocket(SOCKET s) {
|
||||||
// Calling shutdown() prior to close wakes up callers
|
// Calling shutdown() prior to close wakes up callers
|
||||||
// blocked in connect(), recv(), and friends.
|
// blocked in connect(), recv(), and friends.
|
||||||
shutdown(s, SHUT_RDWR);
|
shutdown(s, SHUT_RDWR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void shutdownUdpSocket(SOCKET s) {
|
||||||
|
SOCKADDR_LEN len;
|
||||||
|
struct sockaddr_storage addr;
|
||||||
|
unsigned char buf[1];
|
||||||
|
|
||||||
|
// UDP sockets can't be shutdown(), so we'll indicate
|
||||||
|
// termination by sending a 0 byte packet to ourselves
|
||||||
|
|
||||||
|
if (getsockname(s, (struct sockaddr*)&addr, &len) < 0) {
|
||||||
|
Limelog("getsockname() failed: %d\n", (int)LastSocketError());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sendto(s, buf, 0, 0, (struct sockaddr*)&addr, len) < 0) {
|
||||||
|
Limelog("sendto() failed: %d\n", (int)LastSocketError());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void closeSocket(SOCKET s) {
|
void closeSocket(SOCKET s) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
closesocket(s);
|
closesocket(s);
|
||||||
|
@ -43,5 +43,6 @@ void addrToUrlSafeString(struct sockaddr_storage* addr, char* string);
|
|||||||
SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port);
|
SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port);
|
||||||
SOCKET bindUdpSocket(int addrfamily, int bufferSize);
|
SOCKET bindUdpSocket(int addrfamily, int bufferSize);
|
||||||
int enableNoDelay(SOCKET s);
|
int enableNoDelay(SOCKET s);
|
||||||
void shutdownSocket(SOCKET s);
|
void shutdownUdpSocket(SOCKET s);
|
||||||
|
void shutdownTcpSocket(SOCKET s);
|
||||||
void closeSocket(SOCKET s);
|
void closeSocket(SOCKET s);
|
@ -148,7 +148,7 @@ Exit:
|
|||||||
// The thread waiting on RTSP will close the socket.
|
// The thread waiting on RTSP will close the socket.
|
||||||
void terminateRtspHandshake(void) {
|
void terminateRtspHandshake(void) {
|
||||||
if (sock != INVALID_SOCKET) {
|
if (sock != INVALID_SOCKET) {
|
||||||
shutdownSocket(sock);
|
shutdownTcpSocket(sock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,12 +159,10 @@ void stopVideoStream(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (firstFrameSocket != INVALID_SOCKET) {
|
if (firstFrameSocket != INVALID_SOCKET) {
|
||||||
closeSocket(firstFrameSocket);
|
shutdownTcpSocket(firstFrameSocket);
|
||||||
firstFrameSocket = INVALID_SOCKET;
|
|
||||||
}
|
}
|
||||||
if (rtpSocket != INVALID_SOCKET) {
|
if (rtpSocket != INVALID_SOCKET) {
|
||||||
closeSocket(rtpSocket);
|
shutdownUdpSocket(rtpSocket);
|
||||||
rtpSocket = INVALID_SOCKET;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PltJoinThread(&udpPingThread);
|
PltJoinThread(&udpPingThread);
|
||||||
@ -179,6 +177,15 @@ void stopVideoStream(void) {
|
|||||||
PltCloseThread(&decoderThread);
|
PltCloseThread(&decoderThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (firstFrameSocket != INVALID_SOCKET) {
|
||||||
|
closeSocket(firstFrameSocket);
|
||||||
|
firstFrameSocket = INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
if (rtpSocket != INVALID_SOCKET) {
|
||||||
|
closeSocket(rtpSocket);
|
||||||
|
rtpSocket = INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
|
||||||
VideoCallbacks.cleanup();
|
VideoCallbacks.cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user