pull/202/head
Michael Zillgith 6 years ago
commit 7cff085bf0

@ -45,13 +45,13 @@ struct tcp_keepalive {
#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)
struct sSocket { struct sSocket {
SOCKET fd; SOCKET fd;
uint32_t connectTimeout; uint32_t connectTimeout;
}; };
struct sServerSocket { struct sServerSocket {
SOCKET fd; SOCKET fd;
int backLog; int backLog;
}; };
struct sHandleSet { struct sHandleSet {
@ -94,7 +94,7 @@ Handleset_waitReady(HandleSet self, unsigned int timeoutMs)
{ {
int result; int result;
if (self != NULL && self->maxHandle >= 0) { if ((self != NULL) && (self->maxHandle >= 0)) {
struct timeval timeout; struct timeval timeout;
timeout.tv_sec = timeoutMs / 1000; timeout.tv_sec = timeoutMs / 1000;
@ -156,18 +156,18 @@ static bool
prepareServerAddress(const char* address, int port, struct sockaddr_in* sockaddr) prepareServerAddress(const char* address, int port, struct sockaddr_in* sockaddr)
{ {
memset((char *) sockaddr , 0, sizeof(struct sockaddr_in)); memset((char *) sockaddr , 0, sizeof(struct sockaddr_in));
if (address != NULL) { if (address != NULL) {
struct hostent *server; struct hostent *server;
server = gethostbyname(address); server = gethostbyname(address);
if (server == NULL) return false; if (server == NULL) return false;
memcpy((char *) &sockaddr->sin_addr.s_addr, (char *) server->h_addr, server->h_length); memcpy((char *) &sockaddr->sin_addr.s_addr, (char *) server->h_addr, server->h_length);
} }
else else
sockaddr->sin_addr.s_addr = htonl(INADDR_ANY); sockaddr->sin_addr.s_addr = htonl(INADDR_ANY);
sockaddr->sin_family = AF_INET; sockaddr->sin_family = AF_INET;
sockaddr->sin_port = htons(port); sockaddr->sin_port = htons(port);
@ -177,129 +177,129 @@ prepareServerAddress(const char* address, int port, struct sockaddr_in* sockaddr
static bool wsaStartUp() static bool wsaStartUp()
{ {
if (wsaStartupCalled == false) { if (wsaStartupCalled == false) {
int ec; int ec;
WSADATA wsa; WSADATA wsa;
if ((ec = WSAStartup(MAKEWORD(2, 0), &wsa)) != 0) { if ((ec = WSAStartup(MAKEWORD(2, 0), &wsa)) != 0) {
if (DEBUG_SOCKET) if (DEBUG_SOCKET)
printf("WIN32_SOCKET: winsock error: code %i\n", ec); printf("WIN32_SOCKET: winsock error: code %i\n", ec);
return false; return false;
} }
else { else {
wsaStartupCalled = true; wsaStartupCalled = true;
return true; return true;
} }
} }
else else
return true; return true;
} }
static void wsaShutdown() static void wsaShutdown()
{ {
if (wsaStartupCalled) { if (wsaStartupCalled) {
if (socketCount == 0) { if (socketCount == 0) {
WSACleanup(); WSACleanup();
wsaStartupCalled = false; wsaStartupCalled = false;
} }
} }
} }
ServerSocket ServerSocket
TcpServerSocket_create(const char* address, int port) TcpServerSocket_create(const char* address, int port)
{ {
ServerSocket serverSocket = NULL; ServerSocket serverSocket = NULL;
int ec; int ec;
SOCKET listen_socket = INVALID_SOCKET; SOCKET listen_socket = INVALID_SOCKET;
if (wsaStartUp() == false) if (wsaStartUp() == false)
return NULL; return NULL;
struct sockaddr_in server_addr; struct sockaddr_in server_addr;
if (!prepareServerAddress(address, port, &server_addr)) if (!prepareServerAddress(address, port, &server_addr))
return NULL; return NULL;
listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listen_socket == INVALID_SOCKET) { if (listen_socket == INVALID_SOCKET) {
if (DEBUG_SOCKET) if (DEBUG_SOCKET)
printf("WIN32_SOCKET: socket failed with error: %i\n", WSAGetLastError()); printf("WIN32_SOCKET: socket failed with error: %i\n", WSAGetLastError());
wsaShutdown(); wsaShutdown();
return NULL; return NULL;
} }
int optionReuseAddr = 1; int optionReuseAddr = 1;
setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&optionReuseAddr, sizeof(int)); setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&optionReuseAddr, sizeof(int));
ec = bind(listen_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); ec = bind(listen_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (ec == SOCKET_ERROR) { if (ec == SOCKET_ERROR) {
if (DEBUG_SOCKET) if (DEBUG_SOCKET)
printf("WIN32_SOCKET: bind failed with error:%i\n", WSAGetLastError()); printf("WIN32_SOCKET: bind failed with error:%i\n", WSAGetLastError());
closesocket(listen_socket); closesocket(listen_socket);
wsaShutdown(); wsaShutdown();
return NULL; return NULL;
} }
serverSocket = (ServerSocket) GLOBAL_MALLOC(sizeof(struct sServerSocket)); serverSocket = (ServerSocket) GLOBAL_MALLOC(sizeof(struct sServerSocket));
serverSocket->fd = listen_socket; serverSocket->fd = listen_socket;
serverSocket->backLog = 10; serverSocket->backLog = 10;
setSocketNonBlocking((Socket) serverSocket); setSocketNonBlocking((Socket) serverSocket);
socketCount++; socketCount++;
return serverSocket; return serverSocket;
} }
void void
ServerSocket_listen(ServerSocket self) ServerSocket_listen(ServerSocket self)
{ {
listen(self->fd, self->backLog); listen(self->fd, self->backLog);
} }
Socket Socket
ServerSocket_accept(ServerSocket self) ServerSocket_accept(ServerSocket self)
{ {
int fd; int fd;
Socket conSocket = NULL; Socket conSocket = NULL;
fd = accept(self->fd, NULL, NULL); fd = accept(self->fd, NULL, NULL);
if (fd >= 0) { if (fd >= 0) {
conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket)); conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket));
conSocket->fd = fd; conSocket->fd = fd;
socketCount++; socketCount++;
setSocketNonBlocking(conSocket); setSocketNonBlocking(conSocket);
} }
return conSocket; return conSocket;
} }
void void
ServerSocket_setBacklog(ServerSocket self, int backlog) ServerSocket_setBacklog(ServerSocket self, int backlog)
{ {
self->backLog = backlog; self->backLog = backlog;
} }
void void
ServerSocket_destroy(ServerSocket self) ServerSocket_destroy(ServerSocket self)
{ {
closesocket(self->fd); closesocket(self->fd);
socketCount--; socketCount--;
wsaShutdown(); wsaShutdown();
GLOBAL_FREEMEM(self); GLOBAL_FREEMEM(self);
} }
Socket Socket
@ -325,7 +325,7 @@ TcpSocket_create()
printf("SOCKET: failed to create socket (error code=%i)\n", WSAGetLastError()); printf("SOCKET: failed to create socket (error code=%i)\n", WSAGetLastError());
} }
return self; return self;
} }
void void
@ -350,13 +350,9 @@ Socket_connectAsync(Socket self, const char* address, int port)
return false; return false;
} }
if (!prepareServerAddress(address, port, &serverAddress)) if (!prepareServerAddress(address, port, &serverAddress))
return false; return false;
self->fd = socket(AF_INET, SOCK_STREAM, 0);
setSocketNonBlocking(self); setSocketNonBlocking(self);
if (connect(self->fd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) { if (connect(self->fd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {
@ -408,10 +404,10 @@ Socket_checkAsyncConnectState(Socket self)
bool bool
Socket_connect(Socket self, const char* address, int port) Socket_connect(Socket self, const char* address, int port)
{ {
struct sockaddr_in serverAddress; struct sockaddr_in serverAddress;
if (!prepareServerAddress(address, port, &serverAddress)) if (!prepareServerAddress(address, port, &serverAddress))
return false; return false;
setSocketNonBlocking(self); setSocketNonBlocking(self);
@ -555,7 +551,7 @@ Socket_read(Socket self, uint8_t* buf, int size)
return -1; return -1;
} }
return bytes_read; return bytes_read;
} }
int int
@ -572,18 +568,18 @@ Socket_write(Socket self, uint8_t* buf, int size)
bytes_sent = -1; bytes_sent = -1;
} }
return bytes_sent; return bytes_sent;
} }
void void
Socket_destroy(Socket self) Socket_destroy(Socket self)
{ {
if (self->fd != INVALID_SOCKET) { if (self->fd != INVALID_SOCKET) {
closesocket(self->fd); closesocket(self->fd);
} }
socketCount--; socketCount--;
wsaShutdown(); wsaShutdown();
GLOBAL_FREEMEM(self); GLOBAL_FREEMEM(self);
} }

Loading…
Cancel
Save