小弟想写一个软件,能抓取本机指定端口往外发送的UDP数据包,请问怎么实现?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小弟想写一个软件,能抓取本机指定端口往外发送的UDP数据包,请问怎么实现?相关的知识,希望对你有一定的参考价值。
我现在只知道用recvfrom()来抓取本机接收到的数据包,但是本机发送出去的我不知道怎么抓,谢谢各位大大~
#include "stdafx.h"
#include <winsock.h>
int _tmain(int argc, _TCHAR* argv[])
SOCKET udpSock;
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2),&wsa))
return 0;
udpSock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(udpSock == INVALID_SOCKET)
return 0;
SOCKADDR_IN localAddr;
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(7000);
localAddr.sin_addr.s_addr = INADDR_ANY;
if(bind(udpSock,(sockaddr*)&localAddr,sizeof(localAddr)) != 0)
return 0;
BYTE recvBuf[4096];
int recvLen = 0;
SOCKADDR_IN tmpAddr;
int tmpRecvLen;
tmpRecvLen = sizeof(tmpAddr);
int i = 0;
while(true)
ZeroMemory(recvBuf,4096);
recvLen = recvfrom(udpSock,(char *)recvBuf,4096,0,(SOCKADDR *)&tmpAddr,&tmpRecvLen);
printf("recvLen = d%",recvLen);
if(recvLen > 0)
for(int i = 0;i <= recvLen;++i)
printf("0x%02X ",recvBuf[i]);
printf("\n");
closesocket(udpSock);
return 0;
这是抓取接收数据的,怎么改能让它抓取发送出去的数据呢?
java中如何检测本机指定的UDP服务端口是不是被占用?并且自动分配一个可用udp端口;
即java实现:用函数返回一个可用的udp端口(本机客户端)
1.端口占用编译器会报错,可以从错误看出来是不是端口被占用。没有专门的检测工具和方法2.DatagramSocket(在Java中使用UDP协议编程的相关类)
用于接收和发送UDP的Socket实例。该类有3个构造函数:
DatagramSocket():通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。程序会让操作系统分配一个可用的端口。
DatagramSocket(int port):创建实例,并固定监听Port端口的报文。通常用于服务端
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
DatagramSocket具有的主要方法如下:
1)receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
2)send(DatagramPacket dp):发送报文dp到目的地。
3)setSoTimeout(int timeout):设置超时时间,单位为毫秒。
4)close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
希望对您有帮助谢谢 参考技术A 使用异常处理 try catch(Exception h) //表示此端口已经被占用了;
以上是关于小弟想写一个软件,能抓取本机指定端口往外发送的UDP数据包,请问怎么实现?的主要内容,如果未能解决你的问题,请参考以下文章