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