mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-18 01:15:46 +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) {
|
||||
closeSocket(rtpSocket);
|
||||
rtpSocket = INVALID_SOCKET;
|
||||
shutdownUdpSocket(rtpSocket);
|
||||
}
|
||||
|
||||
PltJoinThread(&udpPingThread);
|
||||
@ -271,6 +270,11 @@ void stopAudioStream(void) {
|
||||
PltCloseThread(&decoderThread);
|
||||
}
|
||||
|
||||
if (rtpSocket != INVALID_SOCKET) {
|
||||
closeSocket(rtpSocket);
|
||||
rtpSocket = INVALID_SOCKET;
|
||||
}
|
||||
|
||||
AudioCallbacks.cleanup();
|
||||
}
|
||||
|
||||
|
@ -393,7 +393,7 @@ int stopControlStream(void) {
|
||||
PltSetEvent(&invalidateRefFramesEvent);
|
||||
|
||||
if (ctlSock != INVALID_SOCKET) {
|
||||
shutdownSocket(ctlSock);
|
||||
shutdownTcpSocket(ctlSock);
|
||||
}
|
||||
|
||||
PltInterruptThread(&lossStatsThread);
|
||||
|
@ -294,7 +294,7 @@ int stopInputStream(void) {
|
||||
PltInterruptThread(&inputSendThread);
|
||||
|
||||
if (inputSock != INVALID_SOCKET) {
|
||||
shutdownSocket(inputSock);
|
||||
shutdownTcpSocket(inputSock);
|
||||
}
|
||||
|
||||
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
|
||||
// blocked in connect(), recv(), and friends.
|
||||
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) {
|
||||
#ifdef _WIN32
|
||||
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 bindUdpSocket(int addrfamily, int bufferSize);
|
||||
int enableNoDelay(SOCKET s);
|
||||
void shutdownSocket(SOCKET s);
|
||||
void shutdownUdpSocket(SOCKET s);
|
||||
void shutdownTcpSocket(SOCKET s);
|
||||
void closeSocket(SOCKET s);
|
@ -148,7 +148,7 @@ Exit:
|
||||
// The thread waiting on RTSP will close the socket.
|
||||
void terminateRtspHandshake(void) {
|
||||
if (sock != INVALID_SOCKET) {
|
||||
shutdownSocket(sock);
|
||||
shutdownTcpSocket(sock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,12 +159,10 @@ void stopVideoStream(void) {
|
||||
}
|
||||
|
||||
if (firstFrameSocket != INVALID_SOCKET) {
|
||||
closeSocket(firstFrameSocket);
|
||||
firstFrameSocket = INVALID_SOCKET;
|
||||
shutdownTcpSocket(firstFrameSocket);
|
||||
}
|
||||
if (rtpSocket != INVALID_SOCKET) {
|
||||
closeSocket(rtpSocket);
|
||||
rtpSocket = INVALID_SOCKET;
|
||||
shutdownUdpSocket(rtpSocket);
|
||||
}
|
||||
|
||||
PltJoinThread(&udpPingThread);
|
||||
@ -179,6 +177,15 @@ void stopVideoStream(void) {
|
||||
PltCloseThread(&decoderThread);
|
||||
}
|
||||
|
||||
if (firstFrameSocket != INVALID_SOCKET) {
|
||||
closeSocket(firstFrameSocket);
|
||||
firstFrameSocket = INVALID_SOCKET;
|
||||
}
|
||||
if (rtpSocket != INVALID_SOCKET) {
|
||||
closeSocket(rtpSocket);
|
||||
rtpSocket = INVALID_SOCKET;
|
||||
}
|
||||
|
||||
VideoCallbacks.cleanup();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user