diff --git a/Changelog b/Changelog index 7cb8580..524f3b3 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ 2020-10-18: +- fixed getpeername was not supported on accept connections - fixed windows support with TCP sockets. Needed to call closesocket on windows. - added support for windows. Everything should work but UNIX sockets. diff --git a/UDPTCPNetwork.h b/UDPTCPNetwork.h index 9c30b56..5268af9 100644 --- a/UDPTCPNetwork.h +++ b/UDPTCPNetwork.h @@ -105,6 +105,8 @@ public: class TCP { private: SOCKET sock; + struct sockaddr_storage peeraddr; + string remote_host; string remote_port; int readcnt; @@ -133,7 +135,7 @@ public: TCP* Accept(); SOCKET GetSocket() { return sock; }; - void SetSocket(SOCKET s, struct sockaddr_storage *saddr, int saddrlen); + void SetSocket(SOCKET s, struct sockaddr_storage *saddr, socklen_t saddrlen); const string GetRemoteAddr(); const string GetLocalAddr(); diff --git a/tcp.cc b/tcp.cc index 3f9f5fb..c0893e1 100644 --- a/tcp.cc +++ b/tcp.cc @@ -96,8 +96,8 @@ TCP* TCP::Accept() { struct timeval tv; int retval, err, i; SOCKET newsock; - struct sockaddr_storage cli_addr; - unsigned int cli_len = sizeof(cli_addr); + struct sockaddr_storage cliaddr; + socklen_t cliaddr_len = sizeof(struct sockaddr_storage); char host[NET_BUFFERSIZE]; char port[NET_BUFFERSIZE]; TCP *tcp = NULL; @@ -116,16 +116,15 @@ TCP* TCP::Accept() { else if (retval == -1) { return NULL; } - else if (retval) { #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) - newsock = accept (sock, (struct sockaddr *) &cli_addr, (int*) &cli_len); + newsock = accept (sock, (struct sockaddr *) &cliaddr, (int*) &cliaddr_len); #else - newsock = accept (sock, (struct sockaddr *) &cli_addr, &cli_len); + newsock = accept (sock, (struct sockaddr *) &cliaddr, &cliaddr_len); #endif if (newsock < 0) return NULL; tcp = new TCP(); - tcp->SetSocket(newsock, &cli_addr, cli_len); + tcp->SetSocket(newsock, &cliaddr, cliaddr_len); return tcp; } @@ -136,10 +135,6 @@ TCP* TCP::Accept() { int TCP::Connect(string h, string p) { int i = 0; -// memset (&localaddr, 0x0, sizeof(localaddr)); -// memset (&remoteaddr, 0x0, sizeof(remoteaddr)); -// i = dns_filladdr(h, p, AF_INET, &remoteaddr); -// if (i == 0) return 0; remote_host = h; remote_port = p; @@ -283,21 +278,31 @@ void TCP::Close() { }; -void TCP::SetSocket(SOCKET s, struct sockaddr_storage *saddr, int saddrlen) { +void TCP::SetSocket(SOCKET s, struct sockaddr_storage *saddr, socklen_t saddrlen) { char host[NET_HOSTLEN]; char port[NET_PORTLEN]; int err; - if (sock > 0) Close(); if (s > 0) { sock = s; if (saddr != NULL) { - if ((err = getnameinfo ((struct sockaddr*) &saddr, saddrlen, host, NET_HOSTLEN, + memcpy (&peeraddr, saddr, sizeof(peeraddr)); + if ((err = getnameinfo ((struct sockaddr*) saddr, saddrlen, host, NET_HOSTLEN, port, NET_PORTLEN, NI_NUMERICHOST | NI_NUMERICSERV)) == 0) { remote_host = host; remote_port = port; + } else { + printf ("error: getnameinfo"); +/* if (err == EAI_AGAIN) printf ("EAI_AGAIN\n"); + if (err == EAI_BADFLAGS) printf ("EAI_BADFLAGS\n"); + if (err == EAI_FAIL) printf ("EAI_FAIL\n"); + if (err == EAI_FAMILY) printf ("EAI_FAMILY\n"); + if (err == EAI_MEMORY) printf ("EAI_MEMORY\n"); + if (err == EAI_NONAME) printf ("EAI_NONAME\n"); + if (err == EAI_OVERFLOW) printf ("EAI_OVERFLOW\n"); + if (err == EAI_SYSTEM) printf ("EAI_SYSTEM\n"); */ // windows seem to have different error codes } } } @@ -430,20 +435,13 @@ const string TCP::WebGetURLFile (string url) { const string TCP::GetRemoteAddr() { - string ret; - struct sockaddr addr; - socklen_t addrlen = sizeof (struct sockaddr); + string ret = ""; + socklen_t addrlen = sizeof (peeraddr); char host[256] = ""; char port[256] = ""; - if (getpeername (sock, &addr, &addrlen) == -1) { - printf ("getpeername error: %s\n", strerror(errno)); - return ret; - } - - if (getnameinfo (&addr, addrlen, host, 255, port, 255, 0) == -1) { + if (getnameinfo ((struct sockaddr*)&peeraddr, addrlen, host, 255, port, 255, NI_NUMERICHOST | NI_NUMERICSERV) != 0) { printf ("getnameinfo error: %s\n", strerror(errno)); - return ret; } ret = (string)host + ":" + (string)port; diff --git a/test-tcpserver.cc b/test-tcpserver.cc index 6fe1bad..01649c6 100644 --- a/test-tcpserver.cc +++ b/test-tcpserver.cc @@ -36,31 +36,24 @@ int main(int argc, char **argv) { if (connection == NULL) { connection = tcpserver.Accept(); if (connection != NULL) - printf (" server: got a new connection\n"); + printf (" server: got a new connection from:%s\n", connection->GetRemoteAddr().c_str()); } if (connection != NULL) { memset (buffer, 0x0, NET_BUFFERSIZE); i = connection->ReadTimeout(buffer, NET_BUFFERSIZE, 100); - if (i >= 0) { + if (i > 0) { int c; - printf (" server: (child) got: '%s'\n", buffer); + 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); + else if (i < 0) { 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();