From 2f83dba24c02ec97c87517dd0c8cb413ee5a6574 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 20 Jan 2014 19:26:33 -0500 Subject: [PATCH] Fix error propagation from WinSock functions. Fix cleanup of sockets. Allow the handshake to be interrupted. --- limelight-common/Connection.cpp | 15 ++++++---- limelight-common/ControlStream.cpp | 2 +- limelight-common/Handshake.cpp | 40 ++++++++++++++++++--------- limelight-common/Limelight-internal.h | 1 + limelight-common/PlatformSockets.cpp | 6 ++++ limelight-common/PlatformSockets.h | 2 ++ limelight-common/VideoStream.cpp | 4 +-- 7 files changed, 48 insertions(+), 22 deletions(-) diff --git a/limelight-common/Connection.cpp b/limelight-common/Connection.cpp index b1a4f72..2375f10 100644 --- a/limelight-common/Connection.cpp +++ b/limelight-common/Connection.cpp @@ -37,7 +37,10 @@ void LiStopConnection(void) { Limelog("done\n"); } if (stage == STAGE_HANDSHAKE) { + Limelog("Terminating handshake..."); + terminateHandshake(); stage--; + Limelog("done\n"); } if (stage == STAGE_PLATFORM_INIT) { Limelog("Cleaning up platform..."); @@ -70,12 +73,6 @@ int LiStartConnection(IP_ADDRESS host, PSTREAM_CONFIGURATION streamConfig, PDECO LC_ASSERT(stage == STAGE_HANDSHAKE); Limelog("done\n"); - Limelog("Initializing video stream..."); - initializeVideoStream(host, streamConfig, drCallbacks); - stage++; - LC_ASSERT(stage == STAGE_VIDEO_STREAM_INIT); - Limelog("done\n"); - Limelog("Initializing control stream..."); err = initializeControlStream(host, streamConfig); if (err != 0) { @@ -86,6 +83,12 @@ int LiStartConnection(IP_ADDRESS host, PSTREAM_CONFIGURATION streamConfig, PDECO LC_ASSERT(stage == STAGE_CONTROL_STREAM_INIT); Limelog("done\n"); + Limelog("Initializing video stream..."); + initializeVideoStream(host, streamConfig, drCallbacks); + stage++; + LC_ASSERT(stage == STAGE_VIDEO_STREAM_INIT); + Limelog("done\n"); + Limelog("Starting control stream..."); err = startControlStream(); if (err != 0) { diff --git a/limelight-common/ControlStream.cpp b/limelight-common/ControlStream.cpp index 1c1e84b..6b3bf12 100644 --- a/limelight-common/ControlStream.cpp +++ b/limelight-common/ControlStream.cpp @@ -8,7 +8,7 @@ typedef struct _NVCTL_PACKET_HEADER { } NVCTL_PACKET_HEADER, *PNVCTL_PACKET_HEADER; IP_ADDRESS host; -SOCKET ctlSock; +SOCKET ctlSock = INVALID_SOCKET; STREAM_CONFIGURATION streamConfig; PLT_THREAD heartbeatThread; PLT_THREAD jitterThread; diff --git a/limelight-common/Handshake.cpp b/limelight-common/Handshake.cpp index 36f0d32..d9d5d0c 100644 --- a/limelight-common/Handshake.cpp +++ b/limelight-common/Handshake.cpp @@ -23,61 +23,75 @@ const char PACKET4 [] = { 0x01, 0x01, 0x00, 0x0 }; +SOCKET sock = INVALID_SOCKET; + static int waitAndDiscardResponse(SOCKET sock) { char temp[256]; return recv(sock, temp, sizeof(temp), 0); } +void terminateHandshake(void) { + if (sock != INVALID_SOCKET) { + closesocket(sock); + sock = INVALID_SOCKET; + } +} + +#include + int performHandshake(IP_ADDRESS host) { - SOCKET s; int err; - s = connectTcpSocket(host, 47991); - if (s == INVALID_SOCKET) { + sock = connectTcpSocket(host, 47991); + if (sock == INVALID_SOCKET) { return LastSocketError(); } - enableNoDelay(s); + enableNoDelay(sock); - err = send(s, HELLO, sizeof(HELLO), 0); + err = send(sock, HELLO, sizeof(HELLO), 0); if (err == SOCKET_ERROR) { goto CleanupError; } - err = waitAndDiscardResponse(s); + err = waitAndDiscardResponse(sock); if (err == SOCKET_ERROR) { goto CleanupError; } - err = send(s, PACKET2, sizeof(PACKET2), 0); + err = send(sock, PACKET2, sizeof(PACKET2), 0); if (err == SOCKET_ERROR) { goto CleanupError; } - err = waitAndDiscardResponse(s); + err = waitAndDiscardResponse(sock); if (err == SOCKET_ERROR) { goto CleanupError; } - err = send(s, PACKET3, sizeof(PACKET3), 0); + err = send(sock, PACKET3, sizeof(PACKET3), 0); if (err == SOCKET_ERROR) { goto CleanupError; } - err = waitAndDiscardResponse(s); + err = waitAndDiscardResponse(sock); if (err == SOCKET_ERROR) { goto CleanupError; } - err = send(s, PACKET4, sizeof(PACKET4), 0); + err = send(sock, PACKET4, sizeof(PACKET4), 0); if (err == SOCKET_ERROR) { goto CleanupError; } - closesocket(s); + closesocket(sock); + sock = INVALID_SOCKET; + return 0; CleanupError: - closesocket(s); + closesocket(sock); + sock = INVALID_SOCKET; + return LastSocketError(); } \ No newline at end of file diff --git a/limelight-common/Limelight-internal.h b/limelight-common/Limelight-internal.h index c4b70eb..e952dd1 100644 --- a/limelight-common/Limelight-internal.h +++ b/limelight-common/Limelight-internal.h @@ -18,6 +18,7 @@ void destroyControlStream(void); void requestIdrFrame(void); int performHandshake(IP_ADDRESS host); +void terminateHandshake(void); void initializeVideoDepacketizer(void); void destroyVideoDepacketizer(void); diff --git a/limelight-common/PlatformSockets.cpp b/limelight-common/PlatformSockets.cpp index 3188dc6..0a6e49c 100644 --- a/limelight-common/PlatformSockets.cpp +++ b/limelight-common/PlatformSockets.cpp @@ -5,6 +5,7 @@ SOCKET bindUdpSocket(unsigned short port) { SOCKET s; struct sockaddr_in addr; int val; + int err; s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == INVALID_SOCKET) { @@ -15,7 +16,9 @@ SOCKET bindUdpSocket(unsigned short port) { addr.sin_family = AF_INET; addr.sin_port = htons(port); if (bind(s, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR) { + err = LastSocketError(); closesocket(s); + SetLastSocketError(err); return INVALID_SOCKET; } @@ -28,6 +31,7 @@ SOCKET bindUdpSocket(unsigned short port) { SOCKET connectTcpSocket(IP_ADDRESS dstaddr, unsigned short port) { SOCKET s; struct sockaddr_in addr; + int err; s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { @@ -39,7 +43,9 @@ SOCKET connectTcpSocket(IP_ADDRESS dstaddr, unsigned short port) { addr.sin_port = htons(port); memcpy(&addr.sin_addr, &dstaddr, sizeof(dstaddr)); if (connect(s, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR) { + err = LastSocketError(); closesocket(s); + SetLastSocketError(err); return INVALID_SOCKET; } diff --git a/limelight-common/PlatformSockets.h b/limelight-common/PlatformSockets.h index 5cea1dc..f78dcf6 100644 --- a/limelight-common/PlatformSockets.h +++ b/limelight-common/PlatformSockets.h @@ -4,6 +4,7 @@ #ifdef _WIN32 #include +#define SetLastSocketError(x) WSASetLastError(x) #define LastSocketError() WSAGetLastError() #else #include @@ -13,6 +14,7 @@ #include #define SOCKET int #define LastSocketError() errno +#define SetLastSocketError(x) errno = x #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define closesocket(x) close(x) diff --git a/limelight-common/VideoStream.cpp b/limelight-common/VideoStream.cpp index 98abf40..731ac19 100644 --- a/limelight-common/VideoStream.cpp +++ b/limelight-common/VideoStream.cpp @@ -7,8 +7,8 @@ PDECODER_RENDERER_CALLBACKS callbacks; PSTREAM_CONFIGURATION configuration; IP_ADDRESS remoteHost; -SOCKET rtpSocket; -SOCKET firstFrameSocket; +SOCKET rtpSocket = INVALID_SOCKET; +SOCKET firstFrameSocket = INVALID_SOCKET; LINKED_BLOCKING_QUEUE packetQueue;