我有以下问题 .

我需要发送广播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广播数据报

不幸的是,我收到了我必须发送的数据报,而不是我的设备发送的数据报 .