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

Reply via email to