nbtstat Linux版, 通过IP获取主机名/* NETBIOS name lookup tool - by eSDee of Netric (www.netric.org)
 * yeh.. i was really bored :-)
 *
 * [esdee@pant0ffel] gcc -o nbtstat nbtstat.c && ./nbtstat 10.0.0.4
 * Request sent, waiting for reply... [ctrl-c to abort]
 * Name                Type
 * ----------------------------------
 * HOEPELKO-ESPU0B <00> UNIQUE Workstation Service
 * HOEPELKO-ESPU0B <20> UNIQUE File Server Service
 * WORKGROUP       <00> GROUP  Domain Name
 * WORKGROUP       <1e> GROUP  Browser Service Elections
 * HOEPELKO-ESPU0B <03> UNIQUE Messenger Service
 * ADMINISTRATOR   <03> UNIQUE Messenger Service
 * WORKGROUP       <1d> UNIQUE Master Browser
 * ..__MSBROWSE__. <01> GROUP  Master Browser
 * MAC-addres = 00-02-a5-e1-fd-b7
 * [/home/esdee/nbtstat] */

#include  <stdio.h>
#include  <string.h>
#include  <sys/types.h>
#include  <sys/socket.h>
#include  <netinet/in.h>
#include  <netdb.h>
#include  <unistd.h>

char nbtname[]= /* netbios name packet */
{
    0x80,0xf0,0x00,0x10,0x00,0x01,0x00,0x00,
    0x00,0x00,0x00,0x00,0x20,0x43,0x4b,0x41,
    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
    0x41,0x41,0x41,0x41,0x41,0x00,0x00,0x21,
    0x00,0x01
};

int display();

int main(int argc, char *argv[])
{
    ];

    unsigned ];
    unsigned char *ptr;

    struct sockaddr_in server;
    struct hostent *hp;

    int s;
    int total;

    unsigned int nb_num;
    unsigned int nb_type;

    ;

    ) {
        fprintf(stderr, ]);
        ;
    }

    ])) == NULL)  {
        fprintf(stderr,]);
        ;
    }

    )) < )  { /* 17 = UDP */
        perror("socket");
        ;
    }

    memset(recv,0x0, sizeof(recv));

    bzero((char *) &server, sizeof(server));
    bcopy(hp->h_addr, (char *) &server.sin_addr, hp->h_length);

    server.sin_family = hp->h_addrtype;
    server.sin_port = htons(); /* netbios-ns */

    , ()  {
        perror("sendto");
        ;
    } else {
        fprintf(stdout, "Request sent, waiting for reply... [ctrl-c to abort]\n");

        read(s, recv, );

        fprintf(stdout,"Name                Type\n"
                       "----------------------------------\n");
        ptr=recv+;
         total=*(ptr - ); /* max names */

        while(ptr < recv + sizeof(recv)) {
            memset(temp,0x0, sizeof(temp));
            strncpy(temp, ptr, );         /* copies the name into temp */

            ptr+=;
            nb_num  = *ptr;
            nb_type = *(ptr + );
            ptr+=;

            if (i==total) {          /* max names reached */
                ptr-=;         /* sets the pointer to the mac_addres field */
                fprintf(stdout,"\nMAC-addres = %02x-%02x-%02x-%02x-%02x-%02x\n\n",
                           *(ptr + ), *(ptr + ), *(ptr + ),
                           *(ptr + ), *(ptr + ), *(ptr + ));
                break;
            }

            display(temp,nb_num,nb_type);
            i++;
        }
    }
    close(s);
    ;
}

int display(char *name, unsigned int number, unsigned int type)
{
    ];
    int i;

    memset(description, 0x0, sizeof(description));

    /* list taken from http://support.microsoft.com/default.aspx?scid=KB;EN-US;q163409& */
    /* 0x04 - UNIQUE */
    /* 0x80 - GROUP */

    switch(number) {
        case 0x00:
            if (type <= 0x80) {
                    strncpy(description, );
            } else {
                    strncpy(description, );
            }
            break;
        case 0x01:
            if (type <= 0x80) {
                    strncpy(description, );
            } else {
                    strncpy(description, );
            }
            break;
        case 0x03:
            strncpy(description, );
            break;
        case 0x06:
            strncpy(description, );
            break;
        case 0x1b:
            strncpy(description, );
            break;
        case 0x1c:
            strncpy(description, );
            break;
        case 0x1d:
            strncpy(description, );
            break;
        case 0x1e:
            );
            break;
        case 0x1F:
            strncpy(description, );
            break;
        case 0x20:
            strncpy(description, );
            break;
        case 0x21:
            strncpy(description, );
            break;
        case 0x22:
            strncpy(description, );
            break;
        case 0x23:
            strncpy(description, );
            break;
        case 0x24:
            strncpy(description, );
            break;
        case 0x30:
            strncpy(description, );
            break;
        case 0x31:
            strncpy(description, );
            break;
        case 0x42:
            strncpy(description, );
            break;
        case 0x43:
            strncpy(description, );
            break;
        case 0x44:
            strncpy(description, );
            break;
        case 0x45:
            strncpy(description, );
            break;
        case 0x46:
            strncpy(description, );
            break;
        case 0x4C:
            strncpy(description, );
            break;
        case 0x52:
            strncpy(description, );
            break;
        case 0x6a:
            strncpy(description, );
            break;
        case 0x87:
            strncpy(description, );
            break;
        case 0xbe:
            strncpy(description, );
            break;
        case 0xbf:
            strncpy(description, );
            break;
        default:
            strncpy(description, );
            break;
    }

    ; i < strlen(name); i++) /* replaces weird chars with dots */
         || name[i] > ) name[i] = '.';

    if (name) fprintf(stdout, "%s <%02x> %s\n", name, number, description);
    ;

}

nbtstat Linux版源码, 通过IP获取主机名的更多相关文章

  1. Linux 从源码编译安装 OpenSSH

    https://blog.csdn.net/bytxl/article/details/46639073 Linux 从源码编译安装 OpenSSH以及各问题解决 2015年06月25日 17:37: ...

  2. linux内核源码注解

    轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件 ...

  3. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  4. linux内存源码分析 - SLUB分配器概述

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB ...

  5. linux中断源码分析 - 中断发生(三)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 回顾 上篇文章linux中断源码分析 - 初始化(二)已经描述了中断描述符表和中断描述符数组的初始化,由于在初始 ...

  6. atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结

    atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结 1. 为什么虚拟机语言容易被反编译 1 2. 源码泄露的问题问题 1 3. Excelsior JET 1 4. gcj.的流 ...

  7. linux 手动源码安装lnmp(亲测)

    linux 手动源码安装lnmp笔记(亲测)<pre>先安装这2个yum install gccyum install g++</pre><pre>先在linux ...

  8. Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog

    前两天看到一群里在讨论 Tomcat 参数调优,看到不止一个人说通过 accept-count 来配置线程池大小,我笑了笑,看来其实很多人并不太了解我们用的最多的 WebServer Tomcat,这 ...

  9. Atitit. 查找linux 项目源码位置

    Atitit. 查找linux 项目源码位置 1. netstat   -anp |grep 801 1.1. 1.3 启动关闭nginx3 1.2. 找到nginx配置文件4 1.3. ./etc/ ...

随机推荐

  1. chrome vim插件vimnum快捷键与使用

    Navigating the page j : Scroll down (scrollDown) k : Scroll up (scrollUp) h : Scroll left (scrollLef ...

  2. like的性能问题

    使用like'%匹配的文字%',无法优化,因为索引起不到作用. 不过like'匹配的文字%',索引起作用.

  3. CSS background-position随笔

    1.定义和用法 background-position 属性设置背景图像的起始位置. 这个属性设置背景原图像(由 background-image 定义)的位置,背景图像如果要重复,将从这一点开始. ...

  4. 27、Jquery 事件

    Jquery 事件 在javascript中事件调用方式为onclick.onmouseover等,在jquery中 使用事件无需写前面的on bind()方法 为元素绑定事件 $("#id ...

  5. php 这门语言

    1,基本语法 php在解析一个文件时,会查找开始和结束标记,在开始标记和结束标记之外的会被php引擎忽略 注释:使用 // 和 /*这里是注释*/ 2,php 数据类型 整形 (2345) 浮点型(3 ...

  6. javaBean登录注册

    package javabean; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Res ...

  7. AndroidStudio字体主题样式分享

    最近慢慢在从eclipse往AndroidStudio习惯,但总觉得AS的默认字体颜色看的不舒服,便花了些时间将字体颜色样式改成了和原来类似的.以下是效果图. 这里是下载地址http://downlo ...

  8. Could not parse mapping document from resource cn/spt/model/Student.hbm.xml

    初始hibernate, 写第一个程序 helloworld的错误: Exception in thread "main" org.hibernate.InvalidMapping ...

  9. 2013年10月13日学习:SQL通过图形化界面创建表

    通过SQL2005创建表的方式有两种: 1.通过图形化用户界面来创建表.比较容易出问题,不稳定,容易点错了.不推荐 2.通过命令来创建.大牛都是这样做的,比较好. 通过图形化界面创建:以创建员工表为例 ...

  10. HTTP状态吗汇录

    页面Http状态查询工具说明 建议直接Ctrl+F来查找状态码 如果向您的服务器发出了某项请求要求显示您网站上的某个网页,那么,您的服务器会返回 HTTP 状态代码以响应该请求. 如果向您的服务器发出 ...