2

ホスト名とは、クライアントの PC の名前を意味します。

サーバーに接続されている各クライアントを識別しようとしています。
クライアント -> サーバーのように。サーバーは言う:client hostname has connected.
そのクライアントによるすべてのプロセスは、ホスト名でタグ付けされます。そして、私は本当に方法がわかりません。

私のクライアントコード:

char hostname[1024];

gethostname(hostname, 1023);
send(sock, hostname, hostname, 0);
//now we are done sending the hostname of the client.

私のサーバーコード(ループ):

void clients (int sock)
{
    int n, p;
    char buffer[256];
    char request;
    FILE *file; 
    file = fopen("process.log","a+");


    //the stuff i added for the identification 
    char hostbuf[256];
    bzero(hostbuf,256);
    n = read(sock,hostbuf,255);
            printf("%s has connected.\n",buffer);


    //after the client has been identified then we tag all communications from that client as its hostname/identification.

    do
    {
    bzero(buffer,256);
    p = read(sock,buffer,255);
    if (p < 0) error("ERROR reading from socket");

    //the output i modified
    printf("%s sent: %s\n",hostbuf,buffer);

    n = write(sock,buffer,sizeof(buffer));

    if (n < 0) error("ERROR writing to socket");
    fprintf(file,"%s\n",buffer); /*writes*/ 

    }while(p == 11);

    fclose(file);
}

- - - - - - 編集 - - - - - -

両方の提案を一緒に使用した

コードに追加:

socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET_ADDRSTRLEN];
int port;

   len = sizeof addr;
   getpeername(sock, (struct sockaddr*)&addr, &len);

   // deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
  struct sockaddr_in *s = (struct sockaddr_in *)&addr;
  port = ntohs(s->sin_port);
  inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
  struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
  port = ntohs(s->sin6_port);
 inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}


char host[1024];

   getnameinfo(&addr, sizeof addr, host, sizeof host, NULL, NULL, 0);

それを表示しようとしました:

printf("%s has connected from %s.", host,ipstr);
    //returned 'myip.myisp.net has connected from *.*.*.*.'
    //i want it to return my PC name.
    //my pc name is SashaGre-PC :))

動作しますが、PC 名ではなく「ip.ispdomain.net」が返されます。

4

3 に答える 3

4

さらに、クライアントのホスト名が必要getnameinfoな場合は、 で新しいクライアント接続を取得するたびにサーバーから使用しますaccept。ここに例があります: https://beej.us/guide/bgnet/html/multi/getnameinfoman.html

Windows の場合: http://msdn.microsoft.com/en-us/library/windows/desktop/ms738532(v=vs.85).aspx

于 2012-11-25T16:17:15.413 に答える
2

ホストにそのNetBIOS名前 (「PC 名NBT」と呼んでいます) を照会するには、問題のホストに対して照会を実行する必要があります。NBT は NetBIOS over TCP/IP の略です

これは簡単な作業ではありません。

すでにそうしている実装は、Samba プロジェクトの一部です。

ライブラリは、 NBT クエリを実行libsmbclientする と呼ばれるメソッドを実装します。node_status_query()

この方法の使用例は、nmblookupツールのソースを調べることで見つけることができます。問題のコード パスは、NetBIOS 名を照会するホストの IP アドレスと共にnmblookupのオプションを使用すると呼び出されます。A

nmblookup -A <ip-address>

libsmbclientとはどちらもnmblookupSamba プロジェクトの一部です。

于 2012-11-28T11:56:37.477 に答える
1

サーバーの着信接続ごとにgetpeernameを呼び出して、送信元アドレスを特定したいようです。

于 2012-11-25T16:09:00.380 に答える