Not sure emailing here is the right way to get help/info...
If it is, I am using libmicrohttpd 0.9.73 built with MinGW-w64 i686 and
I am a bit lost on what results MHD_CONNECTION_INFO_CLIENT_ADDRESS is
returning. Here is my testing so far:
const MHD_ConnectionInfo* info = MHD_get_connection_info(connection,
MHD_CONNECTION_INFO_CLIENT_ADDRESS);
const sockaddr* so_client = (info ? info->client_addr : NULL);
//something is wrong with the port...
//search for "s = accept (fd,". This is where the address structure
is first set.
if (so_client->sa_family == AF_INET) {
std::cout << "IP: " << (int)((unsigned char)so_client->sa_data[0])
<< ",";
std::cout << (int)((unsigned char)so_client->sa_data[1]) << ",";
std::cout << (int)((unsigned char)so_client->sa_data[2]) << ",";
std::cout << (int)((unsigned char)so_client->sa_data[3]) << ",";
std::cout << (int)((unsigned char)so_client->sa_data[4]) << ",";
std::cout << (int)((unsigned char)so_client->sa_data[5]) << ",";
std::cout << (int)((unsigned char)so_client->sa_data[6]) << ",";
std::cout << (int)((unsigned char)so_client->sa_data[7]) << "\n";
}
As expected, elements 2,3,4,5 = "127,0,0,1" when connecting from
localhost, but elements 0 and 1 appear sort of random. They are the same
for each connection, but when I restart my program and reconnect, they
are different. Also if I connect with different hostnames like
"localhost" vs "127.0.0.1" they change. All the documentation I found
seemed to suggest that if the sa_family was AF_INET that these would
give the port.
Additionally, if I do this:
const MHD_ConnectionInfo* info2 = MHD_get_connection_info (connection,
MHD_CONNECTION_INFO_CONNECTION_FD);
struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(info2->connect_fd, (struct sockaddr *)&sin, &addrlen)
== 0 &&
sin.sin_family == AF_INET &&
addrlen == sizeof(sin))
{
int local_port = ntohs(sin.sin_port);
std::cout << "Port: " << local_port << "|" << (void*)sin.sin_port
<< "\n";
}
I am able to retrieve the correct port so getsockname seems to correctly
fill out the port portion of a sockaddr structure.
So my question is: what is sa_data[0] and sa_data[1] when
using MHD_CONNECTION_INFO_CLIENT_ADDRESS?
Thanks,
Bruce