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?!


Anmelden zum Antworten