Fix error propagation from WinSock functions. Fix cleanup of sockets. Allow the handshake to be interrupted.

This commit is contained in:
Cameron Gutman 2014-01-20 19:26:33 -05:00
parent d6c77b0323
commit 2f83dba24c
7 changed files with 48 additions and 22 deletions

View File

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

View File

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

View File

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

View File

@ -18,6 +18,7 @@ void destroyControlStream(void);
void requestIdrFrame(void);
int performHandshake(IP_ADDRESS host);
void terminateHandshake(void);
void initializeVideoDepacketizer(void);
void destroyVideoDepacketizer(void);

View File

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

View File

@ -4,6 +4,7 @@
#ifdef _WIN32
#include <Windows.h>
#define SetLastSocketError(x) WSASetLastError(x)
#define LastSocketError() WSAGetLastError()
#else
#include <sys/types.h>
@ -13,6 +14,7 @@
#include <errno.h>
#define SOCKET int
#define LastSocketError() errno
#define SetLastSocketError(x) errno = x
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(x) close(x)

View File

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