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)
上一篇 2022年10月11日 下午5:00
下一篇 2022年10月11日 下午5:16


相关推荐

  • 大气压力换算公式_气压单位换算表(压力单位换算公式大全)

    大气压力换算公式_气压单位换算表(压力单位换算公式大全)1bar=105Pa,一个标准大气压=1.01325*105Pa;1bar=0.98665标准大气压1巴(bar)=100,000帕(Pa)=10牛顿/平方厘米=0.1MPa是压强的单位,早先气象学中常用毫巴.咱们这教材,气压单位一会是hPa,一会是mb,也不说声是什么意思,网上又。mb=mbar毫巴(=百帕)mbar毫巴(=百帕)hPa百帕1百帕=1毫巴=3/4毫米水银柱.参考资料…

    2022年7月11日
    74
  • 简述最优二叉树(赫夫曼树)[通俗易懂]

    简述最优二叉树(赫夫曼树)[通俗易懂]什么是哈夫曼树:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HuffmanTree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。哈夫曼树被用来进行哈夫曼编码,下面来介绍哈夫曼编码:假设需要传送的电文为“ABACCDA”,它只有四种字符,只需要用两个字符的串就可以分辨,假设A,B,C,D的编码分别是00,01,10,11,则该电文的编码便是:“00010010101100”,总长为14位,对方接收时,只需要二位一

    2025年8月1日
    4
  • 大话信号与系统 — 奇文共欣赏[通俗易懂]

    大话信号与系统 — 奇文共欣赏[通俗易懂]大话信号与系统前言:大家都知道《信号与系统》是一门很难的课,很多人虽然学过了,但其实什么也没得到,今天给大家推荐这篇文章,看了之后,相信你会有收获。第一课什么是卷积?卷积有什么用?很多朋友和我一样,工科电子类专业,学了一堆信号方面的课,什么都没学懂,背了公式考了试,然后毕业了。先说”卷积有什么用”这个问题。(有人抢答,”卷积”是为了学习”信号与系…

    2022年8月11日
    10
  • 并查集类的c++封装,比較union_find algorithm四种实现方法之间的性能区别

    并查集类的c++封装,比較union_find algorithm四种实现方法之间的性能区别

    2021年11月17日
    49
  • 第二天

    第二天

    2021年7月22日
    57
  • ACdreamoj1110(多重背包)

    ACdreamoj1110(多重背包)

    2022年1月10日
    43

发表回复

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

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