added better windows support

master
steffen 5 years ago
parent dd9359c709
commit 7d0b48d7bf

@ -1,4 +1,5 @@
2020-10-18: 2020-10-18:
- fixed windows support with TCP sockets. Needed to call closesocket on windows.
- added support for windows. Everything should work but UNIX sockets. - added support for windows. Everything should work but UNIX sockets.
2020-10-15: 2020-10-15:

@ -67,11 +67,13 @@ dep:
clean: clean:
rm Makefile.rules -rf rm Makefile.rules -rf
rm test-tcp -rf rm test-tcpserver -rf
rm test-tcpclient -rf
rm test-udp -rf rm test-udp -rf
rm test-ssl -rf rm test-ssl -rf
rm -rf gmon.out rm -rf gmon.out
rm *.s -rf rm *.s -rf
rm *.exe -rf
rm *.o -rf rm *.o -rf
rm *.oo -rf rm *.oo -rf
rm *~ -rf rm *~ -rf

@ -5,7 +5,7 @@ ETCPREFIX = /etc
LINUXVERSION = 1 LINUXVERSION = 1
CXX = g++ CXX = g++
CXXFLAGS = -ggdb -fPIC -pg -Wno-write-strings -I./ -std=c++11 -DBUILD_LINUX CXXFLAGS = -ggdb -fPIC -pg -Wno-write-strings -I./ -std=c++11 -DBUILD_LINUX=1
LDFLAGS = -lm -pg -lssl -lcrypto LDFLAGS = -lm -pg -lssl -lcrypto
TARGET = lib$(OBJLIB_NAME).so.$(VERSION) TARGET = lib$(OBJLIB_NAME).so.$(VERSION)

@ -4,7 +4,7 @@ PREFIX = /usr
ETCPREFIX = /etc ETCPREFIX = /etc
WINVERSION = 1 WINVERSION = 1
CXX = g++ CXX = g++
CXXFLAGS = -ggdb -fPIC -Wno-write-strings -I./ -std=c++11 -DBUILD_WINDOWS CXXFLAGS = -ggdb -fPIC -Wno-write-strings -I./ -std=c++11 -DBUILD_WINDOWS=1
LDFLAGS = -lm -lssl -lcrypto -lwsock32 -lws2_32 LDFLAGS = -lm -lssl -lcrypto -lwsock32 -lws2_32
TARGET = $(OBJLIB_NAME).dll TARGET = $(OBJLIB_NAME).dll

@ -4,6 +4,8 @@
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
#define WIN32_LEAN_AND_MEAN
#define _NTDDI_VERSION_FROM_WIN32_WINNT2(ver) ver##0000 #define _NTDDI_VERSION_FROM_WIN32_WINNT2(ver) ver##0000
#define _NTDDI_VERSION_FROM_WIN32_WINNT(ver) _NTDDI_VERSION_FROM_WIN32_WINNT2(ver) #define _NTDDI_VERSION_FROM_WIN32_WINNT(ver) _NTDDI_VERSION_FROM_WIN32_WINNT2(ver)
@ -45,6 +47,8 @@
using namespace std; using namespace std;
#define SOCKET int
#define NET_HOSTLEN 256 #define NET_HOSTLEN 256
#define NET_PORTLEN 6 #define NET_PORTLEN 6
#define NET_BUFFERSIZE 1024 #define NET_BUFFERSIZE 1024
@ -60,8 +64,9 @@ using namespace std;
int dns_filladdr (string host, string port, int ai_family, int dns_filladdr (string host, string port, int ai_family,
struct sockaddr_storage *sAddr); struct sockaddr_storage *sAddr);
char *itoa(char* buffer, int number, int size); char *itoa(char* buffer, int number, int size);
void UDPTCPNetwork_Startup();
extern int UDPTCPNetwork_init;
#define UDPTCPNetwork() if(UDPTCPNetwork_init == 0) UDPTCPNetwork_Startup()
/************************************************************************ /************************************************************************
* *
@ -70,7 +75,7 @@ char *itoa(char* buffer, int number, int size);
*/ */
class UDP { class UDP {
private: private:
int sock; SOCKET sock;
int localport; int localport;
size_t readcnt; size_t readcnt;
size_t writecnt; size_t writecnt;
@ -99,7 +104,7 @@ public:
*/ */
class TCP { class TCP {
private: private:
int sock; SOCKET sock;
string remote_host; string remote_host;
string remote_port; string remote_port;
int readcnt; int readcnt;
@ -107,7 +112,7 @@ private:
int islisten; int islisten;
public: public:
TCP(); TCP();
TCP(int s); TCP(SOCKET s);
TCP(string h, string p); TCP(string h, string p);
TCP(string hostport, int defaultport); TCP(string hostport, int defaultport);
~TCP(); ~TCP();
@ -127,8 +132,8 @@ public:
int Listen(int port); int Listen(int port);
TCP* Accept(); TCP* Accept();
int GetSocket() { return sock; }; SOCKET GetSocket() { return sock; };
void SetSocket(int s, struct sockaddr_storage *saddr, int saddrlen); void SetSocket(SOCKET s, struct sockaddr_storage *saddr, int saddrlen);
const string GetRemoteAddr(); const string GetRemoteAddr();
const string GetLocalAddr(); const string GetLocalAddr();

@ -8,6 +8,7 @@
using namespace std; using namespace std;
char dnsip[NET_HOSTLEN]; char dnsip[NET_HOSTLEN];
int UDPTCPNetwork_init = 0;
// //
// convert host and port to sockaddr_in6 // convert host and port to sockaddr_in6
@ -39,3 +40,29 @@ char* itoa(char* buffer, int number, int size) {
snprintf (buffer, size, "%d", number); snprintf (buffer, size, "%d", number);
return buffer; return buffer;
} }
void UDPTCPNetwork_Startup() {
if (UDPTCPNetwork_init != 0) return;
printf ("%s\n", __FUNCTION__);
#ifdef BUILD_WINDOWS
WORD wVersionRequested;
WSADATA wsaData;
int err;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("WSAStartup failed with error: %d\n", err);
return;
}
#endif
UDPTCPNetwork_init = 1;
}

@ -15,6 +15,7 @@ TCP::~TCP() {
} }
TCP::TCP() { TCP::TCP() {
UDPTCPNetwork();
sock = 0; sock = 0;
writecnt = 0; writecnt = 0;
readcnt = 0; readcnt = 0;
@ -93,7 +94,8 @@ int TCP::Listen(int port) {
TCP* TCP::Accept() { TCP* TCP::Accept() {
fd_set rfds; fd_set rfds;
struct timeval tv; struct timeval tv;
int retval, newsock, err, i; int retval, err, i;
SOCKET newsock;
struct sockaddr_storage cli_addr; struct sockaddr_storage cli_addr;
unsigned int cli_len = sizeof(cli_addr); unsigned int cli_len = sizeof(cli_addr);
char host[NET_BUFFERSIZE]; char host[NET_BUFFERSIZE];
@ -121,9 +123,13 @@ TCP* TCP::Accept() {
#else #else
newsock = accept (sock, (struct sockaddr *) &cli_addr, &cli_len); newsock = accept (sock, (struct sockaddr *) &cli_addr, &cli_len);
#endif #endif
printf ("%s:%d newsock:%d", __FILE__, __LINE__, newsock);
if (newsock < 0) return NULL; if (newsock < 0) return NULL;
tcp = new TCP(); tcp = new TCP();
tcp->SetSocket(newsock, &cli_addr, cli_len); tcp->SetSocket(newsock, &cli_addr, cli_len);
printf ("%s:%d setup TCP object sock:%d", __FILE__, __LINE__, tcp->GetSocket());
return tcp; return tcp;
} }
return NULL; return NULL;
@ -220,12 +226,16 @@ long int TCP::Read(char *buffer, long int len) {
long int len_ = len; long int len_ = len;
if (sock <= 0) return -2; if (sock <= 0) return -2;
len_ = read (sock, (void*)buffer, len); len_ = recv (sock, buffer, len, 0);
// printf ("read: "); debug_mem(buffer, len_); printf ("read: %d\n", len_);
if (len_ < 0 && errno == EAGAIN) len_ = 0; if (len_ < 0 && errno == EAGAIN) len_ = 0;
else if (len_ < 0 && errno != EAGAIN) { else if (len_ < 0 && errno != EAGAIN) {
// fprintf (stderr, "%s ERROR:%s\n", __FUNCTION__, strerror (errno)); #ifdef BUILD_WINDOWS
printf ("%s ERROR:%s\n", __FUNCTION__, strerror (errno));
#else
fprintf (stderr, "%s ERROR:%s\n", __FUNCTION__, strerror (errno));
#endif
len_ = -2; len_ = -2;
} }
else if (len_ == 0) len_ = -1; else if (len_ == 0) len_ = -1;
@ -267,7 +277,11 @@ long int TCP::Write(char *buffer, long int len) {
void TCP::Close() { void TCP::Close() {
#ifdef BUILD_WINDOWS
closesocket(sock);
#else
if (sock > 0) close (sock); if (sock > 0) close (sock);
#endif
sock = -1; sock = -1;
islisten = false; islisten = false;
}; };
@ -445,8 +459,6 @@ const string TCP::GetRemoteAddr() {
const string TCP::GetLocalAddr() { const string TCP::GetLocalAddr() {
string ret; string ret;
return ret; return ret;
}; };

@ -0,0 +1,65 @@
#include <string.h>
#include <unistd.h>
#include "UDPTCPNetwork.h"
#define DEFAULT_PORT 12345
int main (int argc, char **argv) {
TCP tcpclient;
char buffer[NET_BUFFERSIZE];
int i;
#ifdef BUILD_WINDOWS
char iobuffer[16];
setvbuf (stdout, iobuffer, _IONBF, 16);
#endif
//
// connect to the server
if (argc == 2) {
if (tcpclient.Connect(argv[1], DEFAULT_PORT) != 1) {
printf ("connect to: %s:%s\n",argv[1], DEFAULT_PORT);
printf ("cloud not connect to server\n");
exit (1);
}
}
else if (argc == 3) {
printf ("connect to: %s:%s\n",argv[1], atoi(argv[2]));
if (tcpclient.Connect(argv[1], argv[2]) != 1) {
printf ("cloud not connect to server\n");
exit (1);
}
}
else {
printf ("\nplease use the ollowing commands:\n\n");
printf (" test-tcpclient destination\n");
printf (" test-tcpclient destination port\n");
return 1;
}
//
// send some data
snprintf (buffer, NET_BUFFERSIZE, "nur ein kleiner Test.");
printf ("client:send '%s' to the server.\n", buffer);
if (tcpclient.Write(buffer, strlen (buffer)) != strlen (buffer)) {
printf ("could not send all data.\n");
exit (1);
}
//
// read some data (wait maximum 10x1000ms)
for (i = 10; i > 0; i--)
if (tcpclient.ReadTimeout(buffer, NET_BUFFERSIZE, 1000) > 0) {
printf ("client:got '%s' from server.\n", buffer);
break;
}
//
// close connection
tcpclient.Close();
return 0;
};

@ -0,0 +1,67 @@
#include <string.h>
#include <unistd.h>
#include "UDPTCPNetwork.h"
#define DEFAULT_PORT 12345
int main(int argc, char **argv) {
TCP tcpserver;
TCP *connection = NULL;
int i, timeout;
pid_t pid;
time_t time_start = time (NULL);
time_t time_now = time (NULL);
char buffer[NET_BUFFERSIZE];
#ifdef BUILD_WINDOWS
char iobuffer[16];
setvbuf (stdout, iobuffer, _IONBF, 16);
#endif
//
// start the server
if (tcpserver.Listen(DEFAULT_PORT) != 1) {
printf ("cloud not start the tcp server\n");
exit (1);
}
printf ("server started\n");
//
// check for connections
while(1) {
if (connection == NULL) {
connection = tcpserver.Accept();
if (connection != NULL)
printf (" server: got a new connection\n");
}
if (connection != NULL) {
i = connection->Read(buffer, NET_BUFFERSIZE);
if (i >= 0) {
int c;
printf (" server: (child) got: '%s'\n", buffer);
for (c = 0; c < i; c++) buffer[c] = toupper(buffer[c]);
connection->Write(buffer, i);
}
else {
printf (" server: (child) got: nothing (i:%d)\n", i);
delete connection;
connection = NULL;
}
}
else {
//
// parent process - just close the client connection
// it will be handeled by the child process.
printf ("no connection\n");
}
usleep (25000);
}
tcpserver.Close();
};

@ -12,6 +12,7 @@
#include "UDPTCPNetwork.h" #include "UDPTCPNetwork.h"
UDP::UDP() { UDP::UDP() {
UDPTCPNetwork();
sock = -1; sock = -1;
localport = -1; localport = -1;
writecnt = 0; writecnt = 0;

Loading…
Cancel
Save