OpenWRT C程序没有收到数据包

时间:2015-04-17 09:52:39

标签: c networking embedded-linux firewall openwrt

我为OpenWrt路由器编译了一个简单的C UDP服务器和客户端。当两个都在我的电脑上时,代码按预期工作。客户端,如果在路由器上,似乎成功发送数据包(端口6115),因为如果我将它们发送到PC(具有相同的服务器代码),我的电脑会确认它们。但是,如果在路由器上,无论客户端是在路由器上运行(使用本地环回)还是在PC上运行,服务器都不会收到它们。

在路由器上,没有其他程序使用端口6115。

我检查了/etc/config/firewall中的防火墙配置,似乎允许来自端口6115的数据包:

config rule

  option input 'ACCEPT'

  option output 'ACCEPT'

  option forward 'ACCEPT'

  option target 'ACCEPT'

  option proto 'tcp udp'

  option src_port '6115'

  option dest_port '6115'

  option name 'Allow-myudp'

  option src '*'

  option family 'ipv4'

我试图禁用防火墙,但没有任何改变。

问题:如果我通过本地环回(127.0.0.1)发送数据包,防火墙是否会干扰,或者我应该尝试除了防火墙以外的其他事情?

我听说问题可能是因为我的路由器设备是big-endian,如果这可能导致问题该怎么办呢?

如果相关,这里是客户端和服务器代码(用于本地环回):

服务器:

int udpSocket, ndat;
struct sockaddr_in serverAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size;
char buf[1024];

udpSocket=socket(PF_INET,SOCK_DGRAM,0);

serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(6115);
memset(serverAddr.sin_zero,'\0',sizeof serverAddr.sin_zero);

bind(udpSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));

addr_size=sizeof serverStorage;

while (1) {

    ndat=recvfrom(udpSocket,buf,1024,0,(struct sockaddr*)&serverStorage,&addr_size);
    printf("DATA RECEIVED WITH %u BYTES\n",ndat);

}

客户端:

int udpSocket;
char buffer[1024]="Hello [home]";
struct sockaddr_in serverAddr;
socklen_t addr_size=sizeof serverAddr;

udpSocket=socket(PF_INET,SOCK_DGRAM,0);

serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(6115);
serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
memset(serverAddr.sin_zero,'\0',sizeof serverAddr.sin_zero);

bind(udpSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));

sendto(udpSocket,buffer,1024,0,(struct sockaddr*)&serverAddr,addr_size);

printf("Sent...\n");

如果您有任何问题,请告诉我如何解决问题的建议。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我的不好,我忽略了服务器代码,因为出于某种原因,它正在PC上工作。无论如何,我必须在调用 bind(); 之前添加 serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);