2012-03-29 24 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