fixing getremoteaddr

origin
steffen 5 years ago
parent c9108c6d81
commit a30fcb9ad0

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

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

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

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

Loading…
Cancel
Save