如何使用 C 程序读取和打印进入接口的 UDP 数据包的十六进制流?
How to read and print the hex stream of UDP packets coming to an interface using C program?
我有一个设备可以向我的 PC 的端口 6053 连续发送 UDP 数据包。
我为 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
可能是什么问题?
代码未bind()
到address:port以本地收听接收器。
传递给 recv_from()
的 src_addr
参数用于不同的目的。
“recv_from
”中的“from
”不是指从哪里接收(不是本地的,也不是远程的,也不是混合的)而是告诉接收者接收到的数据是从哪里发送的。
来自Linux man-page to recv_from()
:
If src_addr is not NULL, and the underlying protocol provides the
source address of the message, that source address is placed in the
buffer pointed to by src_addr.
我有一个设备可以向我的 PC 的端口 6053 连续发送 UDP 数据包。
我为 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
可能是什么问题?
代码未bind()
到address:port以本地收听接收器。
传递给 recv_from()
的 src_addr
参数用于不同的目的。
“recv_from
”中的“from
”不是指从哪里接收(不是本地的,也不是远程的,也不是混合的)而是告诉接收者接收到的数据是从哪里发送的。
来自Linux man-page to recv_from()
:
If src_addr is not NULL, and the underlying protocol provides the source address of the message, that source address is placed in the buffer pointed to by src_addr.