Add a shutdown function for UDP sockets

This commit is contained in:
Cameron Gutman 2016-02-15 17:45:29 -05:00
parent e5a6297d30
commit 167d344e39
7 changed files with 42 additions and 11 deletions

View File

@ -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();
} }

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
} }
} }

View File

@ -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();
} }