2012-03-29 30 views
0

我向網絡模擬器發送帶有一個字段(無符號整數)的結構,並輸出unsigned int,但它不正確。使用UDP發送後,無符號整數顯示爲隨機負整數

如果我不重新運行網絡模擬器,如果我重新發送具有相同編號的結構,它將是相同的隨機整數。如果我發送+1號碼,我得到隨機整數-1。

如果我重新運行網絡模擬器並重新發送具有相同編號的結構,它將顯示一個不同的隨機整數。

這是stuct:

struct pkt_INIT { 
    unsigned int router_id; 
}; 

這是發送結構代碼:

int sock; 
    struct sockaddr_in server_addr; 
    struct hostent *host; 
    char send_data[1024]; 

    host= (struct hostent *) gethostbyname(emulator_host); 

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
    { 
    perror("socket"); 
    exit(1); 
    } 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(emulator_port); 
    server_addr.sin_addr = *((struct in_addr *)host->h_addr); 
    bzero(&(server_addr.sin_zero),8); 

    struct pkt_INIT init; 
    init.router_id = router_id; 
    strcpy(send_data,(char *)&init); 

    sendto(sock, send_data, strlen(send_data), 0, 
     (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 

我沒有任何的網絡仿真器的代碼。

+0

你的標題似乎暗示着你打印一個unsigned int和得到一個負數,這是不可能的。 – 2012-03-29 23:38:09

+0

是的 - 我不知道網絡模擬器的代碼,但它應該打印結構的無符號整數字段,它打印負數(當我在Java中完成時,它打印正確的值)。 – user1136342 2012-03-29 23:40:33

+0

嘗試在發送之前通過'htonl'運行它?也許它應該是網絡字節順序(big-endian)。 – 2012-03-29 23:54:34

回答

1

請勿使用strcpy()將二進制結構放入二進制數組中。同樣,不要使用strlen()來獲取結構體的長度。這兩個函數都是爲字符串設計的,並會複製/讀取字節,直到遇到空字節爲止。使用memcpy()sizeof()代替:

memcpy(send_data, &init, sizeof(init)); 
sendto(sock, send_data, sizeof(init), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 

在這種情況下,剛剛擺脫的陣列,並直接通過結構來sendto()代替:

sendto(sock, (char*)&init, sizeof(init), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 

現在,隨着中說,有是一個問題router_id。大多數網絡協議要求網絡字節順序,所以你可能會或可能不會需要使用htonl(),這取決於模擬器實際上是期待:

init.router_id = htonl(router_id); 
1

您正在使用:strcpy(send_data,(char *)&init);

這是真的什麼你打算做什麼?您正在將結構變量複製到一個字符數組中。假設你只想做一個一個字節的複製這個的方式,仍然存在問題。 init將不會有NULL終止。所以隨後致電strlen()是可疑的。

更新:

只是存儲-1的char數組中,並將其轉換爲在接收器側的整數。

send_data[0]=255; //To store -1 
send_data[1]='\0'; 

接收側:

int i; 
i = recv_data[0]; 

'I' 將具有-1。

+1

如果你展示了使用什麼來代替'strcpy',以及如何取得'sendto'的大小,答案會更好。 – Duck 2012-03-29 23:56:35

+0

@Duck不得不重啓我的電腦,因爲我的系統喜歡暫時停頓一下:)現在更新了。 – 2012-03-30 00:13:25

+0

我不知道我完全理解,但接收器/仿真器期望一個pkt_INIT結構。當我向send_data添加一個空字符時,我得到和以前一樣的結果。如果我發送一個結構體,就像發送整數一樣嗎? – user1136342 2012-03-30 00:29:17