我有以下问题 .
我需要发送广播UDP数据报包,连接到我本地网络的设备应该回复另一个广播UDP数据报包 . 所以沟通应该是这样的:
我 - > 192.168.0.255(或255.255.255.255):“谁在那里?” my_device> 192.168.0.255:“这是我...... IP:......”
这里一个非常重要的条件是我应该始终使用端口30303作为源,同时使用目标端口 . 另一侧的设备可以使用4000以上的随机端口作为源端口,使用30303端口作为目标端口 .
问题是,我的代码,我可以发送UDP广播,我可以看到Wireshark,设备接听我的电话,但我无法设法让我的程序接收广播UDP数据包 .
这是我的来源:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <locale.h>
#include <fcntl.h>
#define DST_PORT 30303
#define SRC_PORT 30303
#define BUFLEN 84
#define IP "192.168.0.255"
int main(int argc, char *argv[]) {
struct sockaddr_in addr, srcaddr;
int fd;
unsigned char buf[BUFLEN];
unsigned char message[]={0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x3a, 0x20, 0x57, 0x68, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x3f, 0x00, 0x0a};
int broadcast=1;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(IP);
addr.sin_port = htons(DST_PORT);
memset(&srcaddr, 0, sizeof(srcaddr));
for(int i=0;i<BUFLEN;i++) buf[i]=0x00;
for(int i=0;i<BUFLEN;i++) printf("0x%x", buf[i]);
printf("\n\033[32mBUFFER CLEARED!\033[0m\n");
srcaddr.sin_family = AF_INET;
srcaddr.sin_addr.s_addr = htonl(INADDR_ANY);
srcaddr.sin_port = htons(SRC_PORT);
setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));
int slen = sizeof(addr);
if (bind(fd, (struct sockaddr *) &srcaddr, sizeof(srcaddr)) < 0) {
perror("bind");
exit(1);
}
/* connect(fd, (struct sockaddr *) &addr, sizeof(addr)); */
if (sendto(fd, message, strlen(message)+2 , 0 , (struct sockaddr *) &addr, sizeof(addr))==-1)
{
printf("\n\033[31mCouldnt send message!!!\033[0m\n");;
}
else printf("\n\033[32mDATAGRAM SENT!\033[0m\n");
puts("\nI am waiting for DGRAM\n");
slen=sizeof(rcvaddr);
//close(fd);
sleep(1);
//connect(fd, (struct sockaddr *) &addr, sizeof(addr));
recvfrom(fd, buf, BUFLEN, 0, (struct sockaddr *) &rcvaddr, &slen);
printf("Recieved!\n");
setlocale(LC_ALL, "");
char temp[4]="\0";
for (int i=0; i<BUFLEN;i++)
{
printf("0x%x ", buf[i]);
}
return 0;
}
我要做的是:1 . 创建套接字2.将源端口更改为固定端口号3.发送UDP广播数据报4.接收UDP广播数据报
不幸的是,我收到了我必须发送的数据报,而不是我的设备发送的数据报 .