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) {
closeSocket(rtpSocket);
rtpSocket = INVALID_SOCKET;
shutdownUdpSocket(rtpSocket);
}
PltJoinThread(&udpPingThread);
@ -270,6 +269,11 @@ void stopAudioStream(void) {
if ((AudioCallbacks.capabilities & CAPABILITY_DIRECT_SUBMIT) == 0) {
PltCloseThread(&decoderThread);
}
if (rtpSocket != INVALID_SOCKET) {
closeSocket(rtpSocket);
rtpSocket = INVALID_SOCKET;
}
AudioCallbacks.cleanup();
}

View File

@ -393,7 +393,7 @@ int stopControlStream(void) {
PltSetEvent(&invalidateRefFramesEvent);
if (ctlSock != INVALID_SOCKET) {
shutdownSocket(ctlSock);
shutdownTcpSocket(ctlSock);
}
PltInterruptThread(&lossStatsThread);

View File

@ -294,7 +294,7 @@ int stopInputStream(void) {
PltInterruptThread(&inputSendThread);
if (inputSock != INVALID_SOCKET) {
shutdownSocket(inputSock);
shutdownTcpSocket(inputSock);
}
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
// 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);

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

View File

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

View File

@ -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);
@ -178,6 +176,15 @@ void stopVideoStream(void) {
if ((VideoCallbacks.capabilities & CAPABILITY_DIRECT_SUBMIT) == 0) {
PltCloseThread(&decoderThread);
}
if (firstFrameSocket != INVALID_SOCKET) {
closeSocket(firstFrameSocket);
firstFrameSocket = INVALID_SOCKET;
}
if (rtpSocket != INVALID_SOCKET) {
closeSocket(rtpSocket);
rtpSocket = INVALID_SOCKET;
}
VideoCallbacks.cleanup();
}