Methode send für Socket in c implementieren



  • Hallo,

    ich bräuchte mal eure Hilfe.

    Ich habe die Datenstruktur Ergebnis:

    struct Ergebnis{
    int ma;
    unsigned int pu;
    unsigned short note;
    };
    

    Nun möchte ich gerne folgende Methode schreiben:

    int sendMessage(int fd, struct Ergebnis *ergebnis);
    

    Dabei wird die Struktur Ergebnis über eine bestehende TCP-Verbindung als Nachricht versendet. Die Funktion sendMessage bekommt einen verbundenen TCP-Socket(fd) und einen Zeiger auf eine Struktur Ergebnis (ergebnis) als Parameter übergeben. Muss nicht als partielles senden implementiert werden.

    Möchte aber auf eine systemunabhängige Übertragung der Daten achten. Die übergebende Nachricht liegt in Host-Byteorder vor und darf nicht verändert werden.

    Könnt ihr mir da weiterhelfen?

    Mein Lösungsansatz:

    int sendMessage(int fd, struct Ergebnis *ergebnis)
    {
    	int bytessend;
    	buffer[]; //Muesstes ein SPeicherbereich sein, der die verschiedenen Werte aufnehmen kann
    	buffer[0] = htonl(ergebnis->ma);
    	buffer[1] = htonl(ergebnis->pu);
    	buffer[2] = htons(ergebnis->note);
    	bytessend = send(fd, buffer,strlen(buffer),0);  //strlen gilt ja nur für Stings muesste dann entprchend angepasst werden
     	if(bytessend==-1)
    		{	fprintf(stderr, "error incomplete transfer");
    			return -1;
    		}
    	return 0;
    }
    


  • typedef struct {
    uint32_t ma,pu;
    uint16_t note;
    } Ergebnis;
    
    int sendMessage(int fd, Ergebnis *ergebnis)
    {
      int bytessend;
      ergebnis->ma = htonl(ergebnis->ma);
      ergebnis->pu = htonl(ergebnis->pu);
      ergebnis->note = htons(ergebnis->note);
      bytessend = send(fd,ergebnis,sizeof*ergebnis,0);
      if( -1==bytessend )
        fputs("error incomplete transfer",stderr);
      return bytessend;
    }
    


  • Hi,

    danke für die schnelle Antwort.

    Bei der Lösung stört mich jedoch, dass man das Original (*ergebnis) verändert.

    D.h. da müsste irgendwie noch mit einer Kopie gearbeitet werden.

    Bei sizeof fehlen doch noch die Klammern, oder?
    Also:

    typedef struct { 
    uint32_t ma,pu; 
    uint16_t note; 
    } Ergebnis; 
    
    int sendMessage(int fd, Ergebnis *ergebnis) 
    { 
      int bytessend; 
      ergebnis->ma = htonl(ergebnis->ma); 
      ergebnis->pu = htonl(ergebnis->pu); 
      ergebnis->note = htons(ergebnis->note); 
      bytessend = send(fd,ergebnis,sizeof(*ergebnis),0); 
      if( -1==bytessend ) 
        fputs("error incomplete transfer",stderr); 
      return bytessend; 
    }
    

    Wäre super, wenn ihr mir da erneut helfen könntet.

    Danke!!!



  • tisc schrieb:

    D.h. da müsste irgendwie noch mit einer Kopie gearbeitet werden.

    Bei sizeof fehlen doch noch die Klammern, oder?

    Dann mach das doch / nein.



  • Leider bin ich in C noch nicht so fit.
    Den Quellcode verstehe ich zwar, aber es wäre dennoch nett, wenn ihr mir die Zeile noch hinzufügen könntet 😉

    Hier mal mein Versuch:

    typedef struct { 
    uint32_t ma,pu; 
    uint16_t note; 
    } 
    struct Ergebnis Ergebnis1;
    struct Ergebnis Ergebnis2;
    Ergebnis1=Ergebnis2; 
    
    int sendMessage(int fd, Ergebnis2 *ergebnis) 
    { 
      int bytessend; 
      ergebnis->ma = htonl(ergebnis->ma); 
      ergebnis->pu = htonl(ergebnis->pu); 
      ergebnis->note = htons(ergebnis->note); 
      bytessend = send(fd,ergebnis,sizeof(*ergebnis),0); 
      if( -1==bytessend ) 
        fputs("error incomplete transfer",stderr); 
      return bytessend; 
    }
    

    Wäre echt dankbar.

    P.S.: Laut Doku müsste es aber heißen sizeof(Datentyp) --> Also mit Klammern. Warum könnte ich sie hier also weglassen?



  • Auch noch rummäkeln:
    sizeof im Variablenkontext ist ein Operator und keine Funktion. Der Code ist somit OK.
    Ersetze *ergebnis durch ergebnis, dann schlägt die Änderung nicht in den aufrufenden Kontext durch. (call by value)



  • @Wutz: Sorry, ich möchte nicht rummäkeln. Ich möchte es einfach richtig verstehen. Deshalb habe ich erneut nachgefragt. Bin dir echt super dankbar!!!
    Also die "fertige" Lösung ist:

    typedef struct { 
    uint32_t ma,pu; 
    uint16_t note; 
    } Ergebnis; 
    
    int sendMessage(int fd, Ergebnis ergebnis) 
    { 
      int bytessend; 
      ergebnis->ma = htonl(ergebnis->ma); 
      ergebnis->pu = htonl(ergebnis->pu); 
      ergebnis->note = htons(ergebnis->note); 
      bytessend = send(fd,ergebnis,sizeof ergebnis,0); 
      if( -1==bytessend ) 
        fputs("error incomplete transfer",stderr); 
      return bytessend; 
    }
    

    Danke!



  • Das wird so nix.
    Hast du das kompiliert bekommen? Würde mich wundern.
    Du musst noch -> durch . ersetzen, sowie &ergebnis verwenden.



  • Wutz schrieb:

    sizeof im Variablenkontext ist ein Operator und keine Funktion. Der Code ist somit OK.

    In welchem Kontext ist sizeof denn kein Operator?
    🙂


Anmelden zum Antworten