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