我爲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");
如何解決請給我點建議如果你有任何問題的話。提前致謝。