给你个UDP服务端与客户端的示例:
服务端代码:
import javanetDatagramPacket;
import javanetInetAddress;
import javanetMulticastSocket;
public class UDPMulticastServer {
final static int RECEIVE_LENGTH = 1024;
static String multicastHost = "224001";
static int localPort = 9998;
public static void main(String[] args) throws Exception {
InetAddress receiveAddress = InetAddressgetByName(multicastHost);
if (!receiveAddressisMulticastAddress()) {// 测试是否为多播地址
throw new Exception("请使用多播地址");
}
int port = localPort;
MulticastSocket receiveMulticast = new MulticastSocket(port);
receiveMulticastjoinGroup(receiveAddress);
boolean isStop = false;
while(!isStop){
DatagramPacket dp = new DatagramPacket(new byte[RECEIVE_LENGTH], RECEIVE_LENGTH);
receiveMulticastreceive(dp);
String data = new String(dpgetData())trim();
Systemoutprintln(data);
if("exit"equals(data)){
Systemoutprintln("程序退出");
isStop = true;
}
}
receiveMulticastclose();
}
}
客户端代码:
import javanetDatagramPacket;
import javanetInetAddress;
import javanetMulticastSocket;
public class UDPMulticastClient {
static String destAddressStr = "224001";
static int destPortInt = 9998;
static int TTLTime = 4;
public static void main(String[] args) throws Exception {
InetAddress destAddress = InetAddressgetByName(destAddressStr);
if(!destAddressisMulticastAddress()){//检测该地址是否是多播地址
throw new Exception("地址不是多播地址");
}
int destPort = destPortInt;
MulticastSocket multiSocket =new MulticastSocket();
// int TTL = TTLTime;
// multiSocketsetTimeToLive(TTL);
byte[] sendMSG = "exit"getBytes();
DatagramPacket dp = new DatagramPacket(sendMSG, sendMSGlength, destAddress , destPort);
multiSocketsend(dp);
multiSocketclose();
}
}
class PingExam
{
public static void Main()
{
Ping ping = new Ping();
string ip = "192168143"; // 目标ip
int[] ports = { 20, 21, 25, 80, 8080, 2588 }; // 需要扫描的端口
scanPort(IPAddressParse(ip), ports);
}
private static void scanPort(IPAddress address, int[] ports)
{
try {
int count = portsLength;
AutoResetEvent[] arEvents = new AutoResetEvent[count]; // 同步对象
for (int i = 0; i < count; i++) {
arEvents[i] = new AutoResetEvent(false); // 同步对象, 初始未触发
Socket socket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);
socketBind(new IPEndPoint(IPAddressAny, 0));
socketBeginConnect(new IPEndPoint(address, ports[i]),
callback,
new ArrayList() { socket, ports[i], arEvents[i]} // 传递3个参数: 当前socket, 端口, 同步对象
);
}
WaitHandleWaitAll(arEvents); // 等待所有扫描工作完成
}
catch (Exception ex) {
ConsoleWriteLine(exMessage);
}
}
private static void callback(IAsyncResult ar) // 扫描完成后的回调方法
{
ArrayList list = (ArrayList)arAsyncState; // 获取传递的参数
Socket socket = (Socket)list[0];
int port = (int)list[1];
AutoResetEvent arevent = (AutoResetEvent)list[2];
if (arIsCompleted && socketConnected) {
ConsoleWriteLine("port: {0} open", port); // 检查 connected属性, 如果为true 则表示是开放的
}
else {
ConsoleWriteLine("port: {0} closed", port);
}
try {
socketShutdown(SocketShutdownBoth);
socketClose();
}
catch {
}
areventSet(); // 完成后触发
}
}
教你如何查看自己开放的端口!可以利用查看本机开放端口的方法来检查自己是否被种了木马或其它hacker程序。以下是详细方法介绍。1. Windows本身自带的netstat命令关于netstat命令,我们先来看看windows帮助文件中的介绍:Netstat显示协议统计和当前的 TCP/IP 网络连接。该命令只有在安装了 TCP/IP 协议后才可以使用。netstat [-a] [-e] [-n] [-s] [-p protocol] [-r] [interval]参数-a显示所有连接和侦听端口。服务器连接通常不显示。-e显示以太网统计。该参数可以与 -s 选项结合使用。-n以数字格式显示地址和端口号(而不是尝试查找名称)。-s显示每个协议的统计。默认情况下,显示 TCP、UDP、ICMP 和 IP 的统计。-p 选项可以用来指定默认的子集。 -p protocol显示由 protocol 指定的协议的连接;protocol 可以是 tcp 或 udp。如果与 -s 选项一同使用显示每个协议的统计,protocol 可以是 tcp、udp、icmp 或 ip。-r显示路由表的内容。interval重新显示所选的统计,在每次显示之间暂停 interval 秒。按 CTRL+B 停止重新显示统计。如果省略该参数,netstat 将打印一次当前的配置信息。好了,看完这些帮助文件,我们应该明白netstat命令的使用方法了。现在就让我们现学现用,用这个命令看一下自己的机器开放的端口。进入到命令行下,使用netstat命令的a和n两个参数:C:\>netstat -anActive ConnectionsProto Local Address Foreign Address StateTCP 0000:80 0000:0 LISTENINGTCP 0000:21 0000:0 LISTENINGTCP 0000:7626 0000:0 LISTENINGUDP 0000:445 0000:0 UDP 0000:1046 0000:0 UDP 0000:1047 0000:0解释一下,Active Connections是指当前本机活动连接,Proto是指连接使用的协议名称,Local Address是本地计算机的 IP 地址和连接正在使用的端口号,Foreign Address是连接该端口的远程计算机的 IP 地址和端口号,State则是表明TCP 连接的状态,你可以看到后面三行的监听端口是UDP协议的,所以没有State表示的状态。看!我的机器的7626端口已经开放,正在监听等待连接,像这样的情况极有可能是已经感染了冰河!急忙断开网络,用杀毒软件查杀病毒是正确的做法。2.工作在windows2000下的命令行工具fport使用windows2000的朋友要比使用windows9X的幸运一些,因为可以使用fport这个程序来显示本机开放端口与进程的对应关系。Fport是FoundStone出品的一个用来列出系统中所有打开的TCP/IP和UDP端口,以及它们对应应用程序的完整路径、PID标识、进程名称等信息的软件。在命令行下使用,请看例子:D:\>fportexeFPort v133 - TCP/IP Process to Port MapperCopyright 2000 by Foundstone, Inc >
呵呵,我来简单回答一下吧!
首先你搞错了一个问题,就是没有syn扫描这种东西,只有tcp扫描和udp扫描。而tcp扫描一般是使用tcp的syn数据包来进行的,也就是不严格地说,你说的这两个是同一个东西,呵呵!
所以我在这里详细地解释一下tcp扫描和udp扫描以及它们的区别,希望能对你有所帮助。
tcp端口扫描是通过syn数据包进行的,用于扫描目标机器的端口上是否存在程序监听,通常意义上,普通个人机器上的某个端口如果有程序监听的话,那么它一般是系统漏洞。由于tcp是一个有连接的可靠协议,所以要使用三次握手来建立连接,三次握手的报文分别是(syn)、(ack
syn)和(ack)。进行端口扫描时,首先向对方主机的某一端口发送(syn)报文,如果对方这一端口上有程序在监听(或者说存在漏洞),则回复(syn
ack)报文,否则回复(rst)报文。据此就可以判断对方端口上是否有程序在监听了,或者是否存在漏洞了。
udp端口扫描是通过普通数据包进行的,也是用于扫描对方端口上是否有程序在运行,就像上面所说的,如果普通个人机器上存在这样的端口,那一般也是系统漏洞。但对于udp来说,不存在监听这个概念,因为它是无连接不可靠的协议,发送数据包过去以后,通常也不会有任何的对等回应。因此,udp端口扫描主要是检测是否存在icmp端口不可达数据包。若该数据包出现,则说明对方这一端口上没有程序在监听,或者说该端口不存在漏洞,否则就说明该端口上有程序在监听,或者说存在漏洞。
呵呵,现在可以总结一下他们的区别了,主要是以下几点:
1
tcp是有连接的协议,而udp是无连接的;
2
tcp扫描检测(ack
syn)或者是(rst)报文,而udp检测icmp端口不可达报文;
3
tcp协议是可靠但低效的,可以有效进行端口扫描,范围广,效率低,可以应用于任何网络中;udp协议时不可靠但高效的,范围小,效率高,一般应用于局域网内部,随着网络规模的增大,udp端口扫描的结果准确度会越来越差,极端情况是,如果对internet使用udp端口扫描,所得到的结果一定不准确。
呵呵,回答完毕,希望能对你有所帮助!
以上就是关于请教大神,怎么使用java实现UDP端口扫描全部的内容,包括:请教大神,怎么使用java实现UDP端口扫描、求一个 扫描一个指定ip并指定端口范围的c#程序、怎么样扫描开放的端口大神们帮帮忙等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)