利用C++的Socket可以获得ip和端口号。
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
在socket编程中,服务器端accept()等待一个客户端的连接,当连接成功后,accept拷贝客户端的地址信息到sin_addr里面,我们如何从sin_addr取得此客户端的Ip地址和端口号呢?当sockaddr_insin_family = AF_INET时,sockaddr = sockaddr_in。据此,我们可以做一下转换,就可以利用 inet_ntoa() 来得到ip地址和端口号了:
你使用的是Socket、还是TcpClient这个对象?如果是Socket则可直接使用LocalEndPoint这个属性获取本机的IP地址和端口
如果是TcpClient则可使用tcpClientClientLocalEndPoint这个属性。(tcpClient是一个TcpClient的实例)
这个属性是与服务端连接成功后才能获取的。1、通过socket连接,传递TCP数据包,根据返回数据包,来判断端口是否开启。
2、通过getservbyport,传递TCP数据包,根据返回数据包,来判断所开端口对应的服务。
3、使用thread实现多线程运行
优点:比nmap扫描的速度更快。
缺点:c段扫描时,由于占用路由流量过大,存在断网的风险。(具体为啥,作者还在查,如有想法,欢迎打扰)暂时还没看出问题来,可以测试一下
1、判断getpeername的返回值,若有错误,把错误代码打印出来;
2、wsprintf函数是针对UNICODE字符的吧?为什么不用sprintf
3、你的备注里说因为网络传送是低位先传送,正确的应该是网络字节序和主机字节序的问题,在网络上使用网络字节序,是高位先存。主机字节序其实又包括大端和小端,而htons, htonl, inet_addr, inet_ntoa, inet_ntol这些函数就是用于实现主机字节序和网络字节序的转换的,这些函数内部会根据大端还是小端来决定如何将数值转换成网络字节序。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)