【问题标题】:How to read and print the hex stream of UDP packets coming to an interface using C program?如何使用 C 程序读取和打印进入接口的 UDP 数据包的十六进制流?
【发布时间】:2015-11-02 10:57:00
【问题描述】:

我有一个设备不断向我的 PC 发送 UDP 数据包到端口 6053。

我为 UDP 客户端编写了一个 C 程序来接收这些数据包。

代码:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_BUF 2048
int main(int argc, char** argv)
{
        int sfd,x=1,port=1234;
        struct sockaddr_in serv;
        socklen_t len=sizeof(serv);
        char buf[MAX_BUF]="";

        if(argc!=3){
              printf("Usage: %s ipaddr port\n",argv[0]);
              return 1;
        }

        port=atoi(argv[2]);
        if(port<1 || port>65535){
            printf("Invalid port %d\nValid ports 1-65535\n",port);
            return 1;
        }

        sfd=socket(AF_INET,SOCK_DGRAM,0);
        if(sfd<0){
            perror("Socket\n");
            return 1;
        }

       if (inet_pton(AF_INET, argv[1], &(serv.sin_addr)) == 0){
          printf("Invalid IP\nUse ipv4 address only\n");
          return 1;
       } 

       serv.sin_family=AF_INET;
       serv.sin_port=htons(port);

      if((setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&x,sizeof(x)))<0){
            perror("setsockopt:\n");
            return 1;
      } 

       while(1){
           if(recvfrom(sfd,buf,MAX_BUF,0,(struct sockaddr *)&serv,&len)<=0){
                 perror("Recv:\n");
                 close(sfd);
                 return 1;
           }
  //        printf("%.2X\n",buf);
            printf("%s\n",buf);
            memset(buf,0,MAX_BUF);
       }
       return 0;
}

现在如果我编译并运行代码:

gcc -o udp file.c

./udp 192.168.20.105 6053

什么都没有显示。

如果我使用gdb 运行,我观察到recvfrom() 被阻止在那里。

我还以为是防火墙问题所以加了6053打开,还是不行。

我禁用了防火墙,它不起作用。

但是有数据包进入我的界面,使用tcpdump查看

tcpdump -i eth0 port 6053

可能是什么问题?

【问题讨论】:

    标签: c sockets udp


    【解决方案1】:

    代码错过bind() 到地址:端口以本地收听接收者。


    传递给recv_from()src_addr 参数用于不同的目的。

    recv_from”中的“from”不是指从哪里接收(不是本地的,也不是远程的,也不是混合的),而是告诉接收者从哪里接收数据已收到已发送。

    来自Linux man-page to recv_from()

    如果 src_addr 不为 NULL,并且底层协议提供 消息的源地址,该源地址被放置在 src_addr 指向的缓冲区。

    【讨论】:

    • 那么我应该为 src_addr 提供什么?以及如何从服务器的随机端口接收?提前致谢
    • @RamanaReddy src_addr 参数将告诉您收到的数据报的源地址。每次拨打recvfrom之前,您应该填写len
    • @RamanaReddy:将src_addr 参数传递给recv_from() 是可选的。这在我链接的文档中明确说明,请通过 RTFM。 “随机发送者”:一旦绑定到 本地地址:端口接收来自 任何远程地址:端口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多