2015-04-17 82 views
0

我为OpenWrt路由器编译了一个简单的C UDP服务器和客户端。这两个代码在我的电脑上都能正常工作。如果在路由器上,客户端似乎成功发送数据包(端口6115),因为如果我将它们发送到PC(具有相同的服务器代码),我的PC会对其进行确认。但是,如果在路由器上,服务器不接收它们,客户端是在路由器上(使用本地环回)还是在PC上运行。OpenWRT C程序没有收到数据包

在路由器上,没有其他程序使用端口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"); 

如何解决请给我点建议如果你有任何问题的话。提前致谢。

回答

0

我的不好,我忽略了服务器代码,因为某些原因它在PC上工作。无论如何,我不得不添加serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);在致电之前bind();

相关问题