Merge branch '3.0.1' into gappixels

This commit is contained in:
Dhanya Maliakal
2017-11-10 16:37:28 +01:00
3 changed files with 118 additions and 31 deletions

View File

@ -48,13 +48,13 @@ public:
socketDescriptor (NULL) socketDescriptor (NULL)
{ {
char ip[MAX_STR_LENGTH] = ""; char ip[MAX_STR_LENGTH] = "";
strcpy(ip, hostname_or_ip); memset(ip, 0, MAX_STR_LENGTH);
// convert hostname to ip // convert hostname to ip (not required, but a test that returns if failed)
char* ptr = ConvertHostnameToIp (hostname_or_ip); struct addrinfo *result;
if (ptr == NULL) if ((ConvertHostnameToInternetAddress(hostname_or_ip, &result)) ||
(ConvertInternetAddresstoIpString(result, ip, MAX_STR_LENGTH)))
return; return;
strcpy(ip, ptr);
// construct address // construct address
sprintf (serverAddress, "tcp://%s:%d", ip, portno); sprintf (serverAddress, "tcp://%s:%d", ip, portno);
@ -223,20 +223,58 @@ public:
} }
}; };
/** /**
* Convert Hostname to ip * Convert Hostname to Internet address info structure
* One must use freeaddrinfo(res) after using it
* @param hostname hostname * @param hostname hostname
* @returns string with ip or NULL if error * @param res address of pointer to address info structure
* @return 1 for fail, 0 for success
*/ */
char* ConvertHostnameToIp (const char* const hostname) { // Do not make this static (for multi threading environment)
struct hostent *he = gethostbyname (hostname); int ConvertHostnameToInternetAddress (const char* const hostname, struct addrinfo **res) {
if (he == NULL){ // criteria in selecting socket address structures returned by res
cprintf (RED,"Error: Could not convert hostname to ip (zmq)\n"); struct addrinfo hints;
return NULL; memset (&hints, 0, sizeof (hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
// get host info into res
int errcode = getaddrinfo (hostname, NULL, &hints, res);
if (errcode != 0) {
cprintf (RED,"Error: Could not convert %s hostname to internet address (zmq):"
"%s\n", hostname, gai_strerror(errcode));
} else {
if (*res == NULL) {
cprintf (RED,"Error: Could not convert %s hostname to internet address (zmq): "
"gettaddrinfo returned null\n", hostname);
} else{
return 0;
} }
return inet_ntoa (*(struct in_addr*)he->h_addr); }
cerr << "Error: Could not convert hostname to internet address" << endl;
return 1;
}; };
/**
* Convert Internet Address structure pointer to ip string (char*)
* Clears the internet address structure as well
* @param res pointer to internet address structure
* @param ip pointer to char array to store result in
* @param ipsize size available in ip buffer
* @return 1 for fail, 0 for success
*/
// Do not make this static (for multi threading environment)
int ConvertInternetAddresstoIpString (struct addrinfo *res, char* ip, const int ipsize) {
if (inet_ntop (res->ai_family, &((struct sockaddr_in *) res->ai_addr)->sin_addr, ip, ipsize) != NULL) {
freeaddrinfo(res);
return 0;
}
cerr << "Error: Could not convert internet address to ip string" << endl;
return 1;
}
/** /**
* Send Message Header * Send Message Header
* @param buf message * @param buf message

View File

@ -105,16 +105,14 @@ enum communicationProtocol{
memset(thisClientIP,0,INET_ADDRSTRLEN); memset(thisClientIP,0,INET_ADDRSTRLEN);
memset(dummyClientIP,0,INET_ADDRSTRLEN); memset(dummyClientIP,0,INET_ADDRSTRLEN);
differentClients = 0; differentClients = 0;
struct hostent *hostInfo = gethostbyname(host_ip_or_name);
if (hostInfo == NULL){ struct addrinfo *result;
cerr << "Exiting: Problem interpreting host: " << host_ip_or_name << "\n"; if (!ConvertHostnameToInternetAddress(host_ip_or_name, &result)) {
} else { serverAddress.sin_family = result->ai_family;
// Set some fields in the serverAddress structure. memcpy((char *) &serverAddress.sin_addr.s_addr, &((struct sockaddr_in *) result->ai_addr)->sin_addr, result->ai_addrlen);
serverAddress.sin_family = hostInfo->h_addrtype; freeaddrinfo(result);
memcpy((char *) &serverAddress.sin_addr.s_addr, hostInfo->h_addr_list[0], hostInfo->h_length);
//((char *) &serverAddress.sin_addr.s_addr)[hostInfo->h_length]='\0'; //a fix for valgrind
serverAddress.sin_port = htons(port_number); serverAddress.sin_port = htons(port_number);
socketDescriptor=0; //You can use send and recv, //would it work????? socketDescriptor=0;
} }
clientAddress_length=sizeof(clientAddress); clientAddress_length=sizeof(clientAddress);
} }
@ -129,7 +127,7 @@ enum communicationProtocol{
return SOCK_DGRAM; return SOCK_DGRAM;
default: default:
cerr << "unknow protocol " << p << endl; cerr << "unknown protocol " << p << endl;
return -1; return -1;
} }
} }
@ -574,6 +572,57 @@ enum communicationProtocol{
}; };
/**
* Convert Hostname to Internet address info structure
* One must use freeaddrinfo(res) after using it
* @param hostname hostname
* @param res address of pointer to address info structure
* @return 1 for fail, 0 for success
*/
// Do not make this static (for multi threading environment)
int ConvertHostnameToInternetAddress (const char* const hostname, struct addrinfo **res) {
// criteria in selecting socket address structures returned by res
struct addrinfo hints;
memset (&hints, 0, sizeof (hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
// get host info into res
int errcode = getaddrinfo (hostname, NULL, &hints, res);
if (errcode != 0) {
cprintf (RED,"Error: Could not convert %s hostname to internet address (zmq):"
"%s\n", hostname, gai_strerror(errcode));
} else {
if (*res == NULL) {
cprintf (RED,"Error: Could not convert %s hostname to internet address (zmq): "
"gettaddrinfo returned null\n", hostname);
} else{
return 0;
}
}
cerr << "Error: Could not convert hostname to internet address" << endl;
return 1;
};
/**
* Convert Internet Address structure pointer to ip string (char*)
* Clears the internet address structure as well
* @param res pointer to internet address structure
* @param ip pointer to char array to store result in
* @param ipsize size available in ip buffer
* @return 1 for fail, 0 for success
*/
// Do not make this static (for multi threading environment)
int ConvertInternetAddresstoIpString (struct addrinfo *res, char* ip, const int ipsize) {
if (inet_ntop (res->ai_family, &((struct sockaddr_in *) res->ai_addr)->sin_addr, ip, ipsize) != NULL) {
freeaddrinfo(res);
return 0;
}
cerr << "Error: Could not convert internet address to ip string" << endl;
return 1;
}
int ReceiveDataOnly(void* buf,int length=0){ int ReceiveDataOnly(void* buf,int length=0){
if (buf==NULL) return -1; if (buf==NULL) return -1;

Binary file not shown.