ssdp java_SSDP协议 – 实施[通俗易懂]

ssdp java_SSDP协议 – 实施[通俗易懂]我正在尝试实现SSDP协议,但我不确定它是如何工作的.SSDP通过udp发送数据,这很清楚.如果控制器连接到网络,它可以搜索具有MSEARCH消息的设备,该消息可以发送到多播地址239.255.255.250:1900.每个设备都必须收听此地址并做出响应.但我不知道他们是如何回应的.我在wireshark中看到他们用单播响应,但我不知道如何确定接收响应的端口.编辑–…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

我正在尝试实现SSDP协议,但我不确定它是如何工作的 . SSDP通过udp发送数据,这很清楚 . 如果控制器连接到网络,它可以搜索具有MSEARCH消息的设备,该消息可以发送到多播地址239.255.255.250:1900 . 每个设备都必须收听此地址并做出响应 . 但我不知道他们是如何回应的 . 我在wireshark中看到他们用单播响应,但我不知道如何确定接收响应的端口 .

编辑 – – – – – – – –

我正在尝试使用spike fuzzing框架编写ssdp fuzzer . 正如我所说,我能够发送正确的数据,但无法收到回复 . 我将尝试粘贴一些尖峰代码并简要说明 . 有Spike结构,它代表要发送的数据(它存储实际数据,大小,协议信息……) . 我删除了一些变量以使其更清晰 .

struct spike {

/*total size of all data*/

unsigned long datasize;

unsigned char *databuf;

unsigned char *endbuf;

int fd; /*for holding socket or file information*/

int proto; /*1 for tcp, 2 for udp*/

struct sockaddr_in *destsockaddr;

};

现在我通过udp发送数据,并希望通过以下功能接收一些响应

spike_connect_udp(target,port);

spike_send();

s_read_packet();

功能实现:

int

spike_connect_udp(char * host, int port)

{

int fd;

/*ahh, having udpstuff.c makes this stuff easy*/

fd=udpconnect(host,port);

if (fd==-1)

{

fprintf(stderr,”Couldn’t udp connect to target\n”);

return (0);

}

current_spike->fd=fd;

current_spike->proto=2; /*UDP*/

return 1;

}

int

udpconnect(const char * host, const unsigned short port )

{

int sfd = -1;

struct sockaddr_in addr;

/* Translate hostname from DNS or IP-address form */

memset(&addr, 0, sizeof(addr));

if (!getHostAddress(host, &addr))

{

hdebug(“can’t resolve host or address.\n”);

return -1;

}

addr.sin_family = AF_INET;

addr.sin_port = ntohs(port);

if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

hdebug(“Could not create socket!\n”);

return -1;

}

/* Now connect! */

if (connect(sfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)

{

close(sfd);

return -1;

}

return sfd;

}

int

spike_send()

{

int retval;

switch (current_spike->proto)

{

case 1: /*TCP*/

//deleted, doesnt matter, i am sending via udp

case 2: /*UDP*/

//udp_write_data is function from framework

retval=udp_write_data(current_spike->fd, current_spike->destsockaddr, s_get_size(), s_get_databuf());

break;

}

fflush(0);

return retval;

}

这很好,并通过udp发送数据 . 现在我想通过open socket current_spike-> fd收到一些回复 . 函数s_read_packet void

s_read_packet()

{

unsigned char buffer[5000];

int i;

int size;

s_fd_wait();

printf(“Reading packet\n”);

memset(buffer,0x00,sizeof(buffer));

/what alarm and fcntl does?

alarm(1);

fcntl(current_spike->fd, F_SETFL, O_NONBLOCK);

//this read return error -1 and sets errno to 11 service temporarily unavailable

size=read(current_spike->fd,buffer,1500);

fcntl(current_spike->fd, F_SETFL, 0);

alarm(0);

for (i=0; i

{

if (isprint(buffer[i]))

printf(“%c”,buffer[i]);

else

printf(“[%2.2x]”,buffer[i]);

}

printf(“\nDone with read\n”);

}

int

s_fd_wait()

{

/*this function does a select to wait for

input on the fd, and if there

is, returns 1, else 0 */

int fd;

fd_set rfds;

struct timeval tv;

int retval;

fd=current_spike->fd;

/* Watch server_fd (fd 0) to see when it has input. */

FD_ZERO(&rfds);

FD_SET(fd, &rfds);

/* Wait up to zero seconds . will this wait forever? not on linux.*/

/* from man page: timeout is an upper bound on the amount of time

elapsed before select returns. It may be zero, causing select

to return immediately. If timeout is NULL (no timeout), select

can block indefinitely. */

/*wait 2 seconds only*/

tv.tv_sec = TIMEINSECONDS;

tv.tv_usec = TIMEINUSECONDS;

//printf(“Before select %d:%d\n”,TIMEINSECONDS,TIMEINUSECONDS);

retval = select(fd+1, &rfds, NULL, NULL, &tv);

/* Don’t rely on the value of tv now! */

//printf(“After select retval=%d.\n”,retval);

switch (retval)

{

case 0:

/*Timeout – no packet or keypress*/

return(0);

break;

case -1:

/* ignore interrupted system calls */

if (errno != EINTR)

{

/*some kind of weird select error. Die. */

exit(-1);

}

/*otherwise we got interrupted, so just return false*/

return (0);

break;

default:

{

if (FD_ISSET(fd,&rfds))

return (1);

else

return (0);

}

}

}

但是函数s_read_packet没有产生数据……

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183113.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springboot的启动流程图_springboot运行流程

    springboot的启动流程图_springboot运行流程文章目录前言springboot启动流程图第一部分newSpringApplication()第二部分工厂对象构建实例第三部分SpringApplication.run(启动此应用)第四部分SpringApplicationRunListener第五部分banner彩蛋前言研究springboot启动的整个流程。springboot启动流程图第一部分newSpringApplication()第二部分工厂对象构建实例第三部分SpringApplication.

    2022年8月20日
    5
  • pmp证书(职称证书丢失补办流程)

    前言OpenSSL中的概念很多,网上的文档也非常的多,在这里做一下总结,首先明确以下内容。Https访问完整流程1)客户端发起一个https请求,连接到服务器的443端口。2)服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。证书中有一个公钥来加密信息,私钥由服务器持有。3)验证证书的合法性客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。4)生成随机密码(RSA签名)如果验

    2022年4月18日
    123
  • 3D空间中射线与三角形的交叉检測算法

    3D空间中射线与三角形的交叉检測算法

    2022年1月23日
    37
  • 数组与对象的相互转换[通俗易懂]

    数组与对象的相互转换[通俗易懂]数组与对象的相互转换数组转对象需求letarr=[{label:’男’,value:0},{label:’女’,value:1}]//转换为letobj={0:’男’,1:’女’}代码实现letarr=[{label:’男’,value:0},{label:’女’,value:1}]//方案一//思路//1、使用数组的forEach方法遍历数组//2、定义一个空对象//3、将遍历得到的每一个对象中的value值当做新对象的

    2022年9月10日
    0
  • python rarfile不支持中文路径_python使用zipfile解压文件中文乱码问题

    python rarfile不支持中文路径_python使用zipfile解压文件中文乱码问题中文在编程中真实后娘养的,各种坑爹,python3下中文乱码这个问题抓破了头皮,头疼。看了alex的文章,才有种恍然大悟的感觉(链接在底部)。一句话,就是转换成unicode,压缩前是什么编码,使用什么编码encode再decode回来先看测试代码:#-*-coding:utf-8-*-importzipfile#默认模式r,读azip=zipfile.ZipFile(“/Users…

    2022年10月22日
    1
  • goland2021激活码【在线破解激活】

    goland2021激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    78

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号