64-bit vs 32-bit?
-
Hallo,
ich möchte unter Linux Daten verschlüsselt in einem TCP-Paket innerhalb des Zeitstempels TSval versenden. Das Header-Feld für TSval ist 32 bit groß.
Nun habe ich das Problem, dass auf 32-bit Systemen in diesem Feld (u_int32_t tsval) keine Werte größer 2^31-1=2147483647 versendet werden, auf 64-bit Systemen dagegen schon.
Der verwendete Code stammt vom Paketgerator Sendip (http://www.earth.li/projectpurple/progs/sendip.html). Hier der meiner Meinung nach relevante Codeabschnitt:
88 static void addoption(u_int8_t opt, u_int8_t len, u_int8_t *data, 89 sendip_data *pack) { 90 pack->data = realloc(pack->data, pack->alloc_len + len); 91 *((u_int8_t *)pack->data+pack->alloc_len) = opt; 92 if(len > 1) 93 *((u_int8_t *)pack->data+pack->alloc_len+1)=len; 94 if(len > 2) 95 memcpy((u_int8_t *)pack->data+pack->alloc_len+2,data,len-2); 96 pack->alloc_len += len; 97 } ... 281 /* Timestamp rfc1323 */ 282 u_int32_t tsval=0, tsecr=0; 283 u_int8_t comb[8]; 284 if (2!=sscanf(arg, "%d:%d", &tsval, &tsecr)) { 285 fprintf(stderr, 286 "Invalid value for tcp timestamp option.\n"); 287 fprintf(stderr, 288 "Usage: -tots tsval:tsecr\n"); 289 return FALSE; 290 } 291 tsval=htonl(tsval); 292 memcpy(comb, &tsval, 4); 293 tsecr=htonl(tsecr); 294 memcpy(comb+4, &tsecr, 4); 295 addoption(8,10,comb,pack);
Der Wert für TSval wird auf der Kommandozeile in der Form 24214321:1312312 übergeben und mit sscanf eingelesen. Kann mir bitte jemand sagen, wo hier das Problem liegt und wie ich es beheben kann?
Grüße
-
in einem 32bit unsigned integer kann man 2^32 werte speichern, also 0 bis 2^32-1.
Unabhängig, ob es nun ein 32 oder 64 bit system ist.
Das Problem könnte beim einlesen liegen, wo du mittels "%d" einen signed integer einliest. Versuch mal "%u".
Falls es nicht geht, gibt doch mal die konvertierten Zahlen aus.
-
Hallo lagalopex,
vielen Dank für Deinen Hinweis, mit %u funktioniert es ausgezeichnet.
Mich würde aber trotzdem interessieren, warum es auf einem 64-bit System mit %d funktioniert und auf einem 32-bit System nicht?!