2011-03-18 61 views
0

我知道有相關的問題已經回答,但我沒有設法解決我的問題。UDP C服務器沒有收到數據包

我有一個簡單的UDP客戶端服務器應用程序。客戶端&服務器看起來沒問題,但是服務器沒有收到來自客戶端的數據包,它只是無限接收到網絡ID 192(或者客戶端可能無法正確發送包)。

我似乎無法找出問題,地址&端口都沒問題,我沒有任何防火牆,我甚至爲端口添加了一個異常,只是爲了確保。如果我啓動服務器,我可以看到它正在聽,確定在正確的端口(netstat -a -s -p udp)。你能給我一個提示什麼是錯的嗎?

這裏是我的服務器代碼:

/*.. includes */ 
#define PORT 8888 
#define NPACK 10 
#define MAXLEN 100 

void signalError(char* s){ 
    perror(s);  
    exit(1); 
} 

int main() 
{ 
struct sockaddr_in struct_srv, struct_client; 
int s,i,cod, numbytes; 
size_t clientSize; 
int32_t nr; 
int32_t sir1[MAXLEN], sir2[MAXLEN], sirComune[MAXLEN], nrEl1, nrEl2, nrComune; 

//Creating the socket: 
s = socket(PF_INET, SOCK_DGRAM, 0); 
if(s==-1) signalError("Error while creating socket!"); 

memset(&struct_srv, 0, sizeof(struct_srv)); 
struct_srv.sin_family = AF_INET; 
struct_srv.sin_addr.s_addr = htonl(INADDR_ANY); 
struct_srv.sin_port = htons(PORT); 

s = bind(s, (struct sockaddr*) &struct_srv, sizeof(struct_srv)); 
if(s==-1) signalError("Bind error. Port is already in use!"); 

//receive packets:  
nrEl1 = -1; 

char buf[MAXLEN]; 
printf("Accepting packets:\n"); 
//for(i=0;i<NPACK;i++) { 
for(;;) { 
    //Receive packets from client: 
    clientSize = sizeof(struct_client);   
    numbytes = recvfrom(s, buf, MAXLEN - 1, 0, 
       (struct sockaddr*) &struct_client, &clientSize); 
    buf[numbytes] = '\0'; 

    printf("Packet is %d long.\n", numbytes); 
    printf("Packet contains %s:\n", buf);  
    sleep(3); 
} 

close(s); 
return 0; 
} 

而我的客戶端代碼:

/* includes */ 
#define SRV_IP "127.0.0.1" 
#define NPACK 100 
#define MAXLEN 100 
#define PORT 8888 

void signalError(char* s){ 
    perror(s); 
    exit(1); 
} 

int main(void) 
{ 
struct sockaddr_in struct_client; 
int s, i, result, size_client = sizeof(struct_client); 
int32_t nr, sir1[MAXLEN], sir2[MAXLEN]; 

s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
if(s==-1) signalError("Erorr creating socket!"); 

memset((char*) &struct_client, 0, sizeof(struct_client)); 
struct_client.sin_family = AF_INET; 
struct_client.sin_addr.s_addr = htonl(INADDR_ANY); 
struct_client.sin_port = htons(PORT); 
if(inet_aton(SRV_IP, &struct_client.sin_addr)==0) { 
    fprintf(stderr, "inet_aton() failed\n"); 
    exit(1); 
} 

char buf[MAXLEN]; 
int len; 
for(i=0;i<NPACK;i++) {  
    printf("Give packet %d:\n", i+1);  
    fgets(buf, sizeof(buf), stdin); 
    buf[strlen(buf)-1] = '\0'; 
    printf("I've read %s\n", buf); 
    printf("Sending packet %d\n", i+1); 
    result = sendto(s, buf, sizeof(buf)+1, 0, 
      (struct sockaddr*) &struct_client, size_client); 
    if(result==-1) signalError("Error sending packets!");   
} 

close(s); 
return 0; 
} 
+0

你有沒有試過嗅探應用程序之間的數據包?簡單的netcat足以實現它。 – p4553d 2011-03-18 13:47:02

+0

nr和buf是我必須發送2個整數數組到服務器。我第一次嘗試發送數字(沒有運氣),然後我想看看它是否適用於字符串。但這不是問題。我還添加了喬納森的第一個建議,但仍然是相同的結果。服務器只是收到垃圾。 – joanna 2011-03-18 14:23:30

+0

根據上面的代碼,你仍然發送'&nr',這是從來沒有初始化。你需要設置'nr'使它發送除了已經存在的東西以外的東西,聽起來就像是ASCII字符「192」。 – Jonathan 2011-03-18 14:40:27

回答

1

這裏有幾個小問題:

  1. 在你的服務器上,每次調用recvfrom之前設置size_client = sizeof(struct_client)。它既是輸入參數又是輸出參數,所以你要確保一次調用的輸出不會干擾到下一次的輸入。
  2. 確保將buf的最後一個字節設置爲,以防止printf超出邊界讀取內存。
  3. 什麼是cod?它從哪裏來的?我想你的意思是測試numbytes
  4. 設置buf[strlen(buf) - 1] = '\0'截斷緩衝區的最後一個字符;你想要做什麼?

而主要的原因這是行不通的:

你永遠不會初始化nr,所以沒有告訴什麼SENDTO被髮送。這當然不發送buf,我認爲這是你想要的。你可能希望這樣的:

sendto(s, buf, sizeof(buf), ...) 
+0

我修改了你的建議,但仍然一樣。所有這些都是我關心的事情(比如'\ 0'),但現在它只是令人討厭,因爲我無法弄清楚問題所在,並在經過一些草率修改後發佈了代碼。 – joanna 2011-03-18 14:35:17

0

在您的客戶端代碼,即過網發送沒有初始化,可以指向nr變量無論它想要什麼。您可能想發送您的buf陣列。

1

除非我錯過了一些激烈的東西,你只是在這裏發送垃圾。

nr永遠不會在發件人上初始化,除非在評論中。 buf正在初始化,但沒有在任何地方使用。

你可以嘗試改變的sendto部分是這樣的:

result = sendto(s, buf, strlen(buf)+1, 0, 
     (struct sockaddr*) &struct_client, size_client); 
相關問題