Linux C 服务器 - 标识/命名客户端



主机名是指客户端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: %sn",hostbuf,buffer);
    n = write(sock,buffer,sizeof(buffer));
    if (n < 0) error("ERROR writing to socket");
    fprintf(file,"%sn",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"。

此外,如果需要客户端的主机名,请在每次在 accept 中获取新的客户端连接时从服务器使用getnameinfo。这里有一些例子:https://beej.us/guide/bgnet/html/multi/getnameinfoman.html

对于窗口:http://msdn.microsoft.com/en-us/library/windows/desktop/ms738532(v=vs.85).aspx

要查询主机的NetBIOS名称(您称之为"PC 名称"),您需要对相关主机执行NBT查询。NBT 代表 NetBIOS over TCP/IP。

这不是一项微不足道的任务。

已经这样做的实现是Samba项目的一部分。

该库libsmbclient实现一个名为 node_status_query() 的方法,该方法执行 NBT 查询。

有关如何使用此方法的示例可以通过查找nmblookup工具的源找到。当使用nmblookup的选项A以及要查询的NetBIOS名称的主机的IP地址时,将调用有问题的代码路径。

nmblookup -A <ip-address>

libsmbclientnmblookup都是Samba项目的一部分。

听起来您想在服务器上的每个传入连接上调用 getpeername,以识别源地址。

相关内容

  • 没有找到相关文章

最新更新