2014-05-10 41 views
0

我正在嘗試將單個UDP消息從一臺機器發送到另一臺機器。客戶端是通過調制解調器連接到互聯網的嵌入式Linux系統。沒有防火牆到位。服務器是我擁有的公共VPS服務器。儘管多次調用客戶端服務器從未收到任何東西。任何人都可以看到有什麼可能會出錯?爲什麼這個UDP客戶端/服務器代碼不工作?

客戶端:

int main(int argc, char**argv) 
{ 
    int sockfd,n; 
    struct sockaddr_in servaddr,cliaddr; 
    char sendline[1000]; 
    char recvline[1000]; 

    if (argc != 2) 
    { 
     printf("usage: udpcli <IP address>\n"); 
     exit(1); 
    } 

    sockfd=socket(AF_INET,SOCK_DGRAM,0); 

    bzero(&servaddr,sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr=inet_addr(argv[1]); 
    servaddr.sin_port=htons(32000); 

     sendto(sockfd,"abcd", 4,0, 
      (struct sockaddr *)&servaddr,sizeof(servaddr)); 
}   

服務器:

int main(int argc, char**argv) 
{ 
    int sockfd,n; 
    struct sockaddr_in servaddr,cliaddr; 
    socklen_t len; 
    char mesg[1000]; 

    sockfd=socket(AF_INET,SOCK_DGRAM,0); 

    bzero(&servaddr,sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY); 
    servaddr.sin_port=htons(32000); 
    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); 

    for (;;) 
    { 
     len = sizeof(cliaddr); 
     printf("calling recvfrom\n"); 
     n = recvfrom(sockfd,mesg,4,0,(struct sockaddr *)&cliaddr,&len); 
     printf("-------------------------------------------------------\n"); 
     mesg[n] = 0; 
     printf("Received the following:\n"); 
     printf("%s",mesg); 
     printf("-------------------------------------------------------\n"); 
    } 
} 
+0

嘗試使用'nc -u'從您的電腦發送內容。你在服務器上得到了什麼? – cnicutar

+0

沒有,也沒有工作。 –

+0

好的,現在關閉服務器進程,而是啓動'nc -u -l'。回到你的電腦,再試一次'nc -u'。如果你沒有看到任何東西,它可能會阻塞該端口上的數據報。嘗試使用多個端口,直到找到可以通過的端口。 – cnicutar

回答

1

問題看起來就像是被擋住了我的VPS服務器的UDP流量。當我在Linux PC上重新運行嵌入式系統和客戶端上的服務器時,它工作正常。