- socket-win32: updated WSA initialization handling

This commit is contained in:
Michael Zillgith 2017-08-25 14:57:06 +02:00
parent 17bc388ae5
commit 63510d7ee8
2 changed files with 54 additions and 13 deletions

View File

@ -10,6 +10,7 @@ Changes to version 1.1.0
- IEC 61850 server: added IedModel_getDeviceByInst function
- SV subscriber: added subscriber side handling for RefrTm
- SV publisher: Changed SampledValuesPublisher_create to support setting of Communication parameters at runtime
- socket-win32: updated WSA initialization handling
- all: small fixes and code optimizations

View File

@ -24,6 +24,7 @@
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <stdbool.h>
#pragma comment (lib, "Ws2_32.lib")
@ -104,6 +105,9 @@ Handleset_destroy(HandleSet self)
GLOBAL_FREEMEM(self);
}
static bool wsaStartupCalled = false;
static int socketCount = 0;
static void
activateKeepAlive(SOCKET s)
{
@ -162,19 +166,47 @@ prepareServerAddress(const char* address, int port, struct sockaddr_in* sockaddr
return true;
}
static bool wsaStartUp()
{
if (wsaStartupCalled == false) {
int ec;
WSADATA wsa;
if ((ec = WSAStartup(MAKEWORD(2, 0), &wsa)) != 0) {
if (DEBUG_SOCKET)
printf("WIN32_SOCKET: winsock error: code %i\n", ec);
return false;
}
else {
wsaStartupCalled = true;
return true;
}
}
else
return true;
}
static void wsaShutdown()
{
if (wsaStartupCalled) {
if (socketCount == 0) {
WSACleanup();
wsaStartupCalled = false;
}
}
}
ServerSocket
TcpServerSocket_create(const char* address, int port)
{
ServerSocket serverSocket = NULL;
int ec;
WSADATA wsa;
SOCKET listen_socket = INVALID_SOCKET;
if ((ec = WSAStartup(MAKEWORD(2,0), &wsa)) != 0) {
if (DEBUG_SOCKET)
printf("WIN32_SOCKET: winsock error: code %i\n", ec);
if (wsaStartUp() == false)
return NULL;
}
struct sockaddr_in server_addr;
@ -190,7 +222,9 @@ TcpServerSocket_create(const char* address, int port)
if (listen_socket == INVALID_SOCKET) {
if (DEBUG_SOCKET)
printf("WIN32_SOCKET: socket failed with error: %i\n", WSAGetLastError());
WSACleanup();
wsaShutdown();
return NULL;
}
@ -203,7 +237,9 @@ TcpServerSocket_create(const char* address, int port)
if (DEBUG_SOCKET)
printf("WIN32_SOCKET: bind failed with error:%i\n", WSAGetLastError());
closesocket(listen_socket);
WSACleanup();
wsaShutdown();
return NULL;
}
@ -214,6 +250,8 @@ TcpServerSocket_create(const char* address, int port)
setSocketNonBlocking((Socket) serverSocket);
socketCount++;
return serverSocket;
}
@ -252,7 +290,8 @@ void
ServerSocket_destroy(ServerSocket self)
{
closesocket(self->fd);
WSACleanup();
socketCount--;
wsaShutdown();
GLOBAL_FREEMEM(self);
}
@ -264,6 +303,8 @@ TcpSocket_create()
self->fd = INVALID_SOCKET;
self->connectTimeout = 5000;
socketCount++;
return self;
}
@ -277,14 +318,10 @@ bool
Socket_connect(Socket self, const char* address, int port)
{
struct sockaddr_in serverAddress;
WSADATA wsa;
int ec;
if ((ec = WSAStartup(MAKEWORD(2,0), &wsa)) != 0) {
if (DEBUG_SOCKET)
printf("WIN32_SOCKET: winsock error: code %i\n", ec);
if (wsaStartUp() == false)
return false;
}
if (!prepareServerAddress(address, port, &serverAddress))
return false;
@ -401,5 +438,8 @@ Socket_destroy(Socket self)
closesocket(self->fd);
}
socketCount--;
wsaShutdown();
GLOBAL_FREEMEM(self);
}