socks5_getserv Subroutine

Purpose

Return the address of the SOCKSv5 server (if any) to use when connecting to a given destination.

Library

Standard C Library (libc.a)

Syntax

#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
struct sockaddr * socks5_getserv (Dst, DstLen)
struct sockaddr *Dst;
size_t DstLen;

Description

The socks5_getserv subroutine determines which (if any) SOCKSv5 server should be used as an intermediary when connecting to the address specified in Dst.

The address returned in Dst may be IPv4 or IPv6 or some other family.  The user should check the address family before using the returned data.

The socket applications can be compiled with COMPAT_43 defined. This will make the sockaddr structure BSD 4.3 compatible. For more details refer to socket.h.

Parameters

Item Description
Dst Specifies the external address of the target socket to use as a key for looking up the appropriate SOCKSv5 server.
DstLength Specifies the length of the address structure in Dst.

Return Values

  • Upon successful lookup, the socks_getserv subroutine returns a reference to a sockaddr struct.
  • If the socks5tcp_connect subroutine is unsuccessful in finding a server, for any reason, a value of NULL is returned. If an error occurred, an error code, indicating the generic system error, is moved into the errno global variable.

Error Codes (placed in errno)

The socks5_getserv subroutine is unsuccessful if no server is indicated or if any of the following errors occurs:

Error Description
EAFNOSUPPORT The addresses in the specified address family cannot be used with this socket.
EFAULT The Dst parameter is not in a writable part of the user address space.
EINVAL One or more of the specified arguments is invalid.
ENOMEM The Dst parameter is not large enough to hold the server address.

Examples

The following program fragment illustrates the use of the socks5_getserv subroutine by a client to request a connection from a server's socket.

struct sockaddr_in6 dst;

struct sockaddr *srv;
.
.
.
srv = socks5_getserv((struct sockaddr*)&dst, sizeof(dst));

if (srv !=NULL)  {

     /* Success: srv should be used as the socks5 server */

} else {
     /* Failure: no server could be returned.  check errno */
     
}