2015-04-17 50 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();

相關問題