Enhorabuena por atreverte con los sockets de verdad y no con WinSock.
La respuesta es sencilla. En C se suele usar una cosa que se llaman "punteros". Se usan para almacenar direcciones de memoria.
Una función normal pide datos y devuelve otro u otros. En el caso de gethostname, pide dos datos y devuelve un estado.
Pero uno de los datos no es una variable String en sí misma, sino una _dirección_ para guardar el resultado allí.
La definición es:
http://msdn.microsoft.com/library/de...hostname_2.asp
Código:
int gethostname(
char* name,
int namelen
);
Parameters
name
[out] Pointer to a buffer that receives the local host name.
namelen
[in] Length of the buffer, in bytes.
Return Values
If no error occurs, gethostname returns zero. Otherwise, it returns SOCKET_ERROR and a specific error code can be retrieved by calling WSAGetLastError.
Atento a "Pointer to a buffer that receives the local host name." -> Puntero que recibirá el nombre de la máquina local.
En la API de Windows es común esto. En C y otros lenguajes es muy común, pero en VB no está "documentado". Para obtener la dirección de una variable, necesitas usar la función VarPtr. El resultado es el que debes pasar a la función de la API.