Client IP address when using Xvnc with -inetd

Tim Underwood TimU "at" hightouchinc.com
Mon Jan 23 14:49:03 2006


Using your suggestion, I've created the following program:


#include <linux/socket.h>
#include <linux/in.h>
#include <errno.h>
#include <stdio.h>



char* get_viewer_ipaddress()
{
	struct sockaddr_in s;
	char *client_ip = NULL;
	int len, ret_val;

	if(client_ip == NULL)
	{
		memset(&s,0,sizeof(s));
		len = sizeof(s);
		s.sin_family = AF_INET;

		/*
		 * when launched from inetd, stdin, stdout and stderr
		 * are mapped to sd. Hence passing 0 to getpeername
		 */
		ret_val = getpeername(0, (struct sockaddr *)&s, &len);
		if(!ret_val)
		{
			client_ip = (char *)inet_ntoa(s.sin_addr);
			printf("Inf: retrieved client IP address %s\n",
client_ip);
		}
		else
		{
			client_ip = NULL;
			printf("Err: could not retrieve client IP
address, error=%d\n", errno);
		}
	}

	return client_ip;
}


int main(int argc, char *argv[])
{
    get_viewer_ipaddress();
    return(0);
}


However, when I run this within an xterm running in a VNC desktop, I get
an error, ENOTSOCK (88), indicating the handle is not a socket.  Hence,
I am assuming this would need to be added to the Xvnc source, and
determined from within Xvnc?

> -----Original Message-----
> From: Jinu Mathew Joy [mailto:jjoy "at" novell.com] 
> Sent: Sunday, January 22, 2006 9:46 PM
> To: Tim Underwood; vnc-list "at" realvnc.com
> Subject: Re: Client IP address when using Xvnc with -inetd
> 
> You would use -inetd option when running Xvnc from xinetd. 
> Say you have configured the xinetd process to listen for 
> connections on behalf of Xvnc on port xxxx. 
> As soon as a request arrives on the configured port xxxx, 
> xinetd forks off Xvnc and maps the stdin, stdout and stderr 
> to the socket descriptor.
> 
> What it means is now on if you do a printf() the string would 
> be directed to the client(vncviewer) and not stdout. Since 
> stdout is mapped to the socket descriptor and this stage.
> 
> Hence if you want the client IP, all you would do is the following.. 
> 
> char* get_viewer_ipaddress()
> {
> 	struct sockaddr_in s;
> 	char *client_ip = NULL;
> 	int len, ret_val;
> 
> 	if(client_ip == NULL)
> 	{
> 		memset(&s,0,sizeof(s));
> 		len = sizeof(s);
> 		s.sin_family = AF_INET;
> 
> 		/*
> 		 * when launched from inetd, stdin, stdout and stderr
> 		 * are mapped to sd. Hence passing 0 to getpeername
> 		 */
> 		ret_val = getpeername(0, (struct sockaddr *)&s, &len);
> 		if(!ret_val)
> 		{
> 			client_ip = (char *)inet_ntoa(s.sin_addr);
> 			DEV_LOG("Inf: retrieved client IP 
> address %s\n", client_ip);
> 		}
> 		else
> 		{
> 			client_ip = NULL;
> 			DEV_LOG("Err: could not retrieve client 
> IP address\n");
> 		}
> 	}
> 
> 	return client_ip;
> }
> 
> let me know if that helps.. 
> 
> -Jinu
> 
> 
> 
> >>> "Tim Underwood" <TimU "at" hightouchinc.com> 01/21/06 1:58 AM >>>
> How can I determine a client's IP address, when they connect 
> to a server running Xvnc with the -inetd option?
> 
> Can't use $DISPLAY, since it's the server's address, and I 
> don't find anything identifiable that can be used to get back 
> to the client. 
> Can't
> even find anything via the process chain to get from a 
> running application back to the Xvnc process (xterm's run 
> within the VNC client eventually show their parent as "init" 
> or process id 1, never going back to the Xvnc process I know 
> is the one I started).
> 
> I need to do this for some customized settings for terminals 
> attaching to our server (printers, etc.), and identifying 
> them for other purposes.
> 
> Any ideas?
> _______________________________________________
> VNC-List mailing list
> VNC-List "at" realvnc.com
> To remove yourself from the list visit:
> http://www.realvnc.com/mailman/listinfo/vnc-list