Methode um Daten über einen Socket zu versenden
-
Jo, und nachr wirst Du so nicht senden können, sondern eher:
(char *) &nachr
so.
-
Hey,
danke für eure Antworten. Das mit short ist natürlich falsch, hatte ich übersehen.
Einen Fehler habe ich nicht, konnte bisher alles kompilieren, jedoch noch nicht testen. Wollte nur wissen ob mein Lösungsansatz so richtig ist, insbesondere mit den * und & habe ich so meine ProblemeIst so alles richtig? Und falls ja, wieso kann ich die "nachr" nicht einfach so senden?
int sendNachricht(int fd, struct Nachricht nachr) { int tmpsend; nachr.date = htonl(nachr.date); /* data und user müssen offensichtlich nicht umgewandelt werden */ tmpsend = send(fd, (char *) &nachr, sizeof nachr,0); return tmpsend; }
Vielen Dank!
-
Einen Fehler habe ich nicht, konnte bisher alles kompilieren,
Kompilierbar != fehlerfreies Programm.
insbesondere mit den * und & habe ich so meine Probleme
Dann lerne die Grundlagen nochmals oder stelle eine Frage diesbezueglich.
Ist so alles richtig?
Probiere es aus.
Und falls ja, wieso kann ich die "nachr" nicht einfach so senden?
Wer sagt, dass du das nicht kannst?
Ansonsten: http://beej.us/guide/bgnet/
-
modk schrieb:
Einen Fehler habe ich nicht, konnte bisher alles kompilieren
[...]
Und falls ja, wieso kann ich die "nachr" nicht einfach so senden?
Das wundert mich, denn send (zumindest das send, das ich kenne) möchte als zweiten Parameter einen Zeiger auf char.
-
modk schrieb:
Einen Fehler habe ich nicht, konnte bisher alles kompilieren
Das kann nicht sein. Das
send(fd, nachr, sizeof nachr,0);
kann in C nicht compilieren. Das heißt, entweder machst du bei der Übersetzung an sich etwas falsch (falsche Datei übersetzt? Uns den falschen Code gezeigt?) oder du schreibst das Programm gar nicht in C, sondern einer anderen Sprache (C++?).Übrigens habe ich nicht gemeint, dass du das htonl auf user komplett weglassen sollst. Das mag zwar zufällig funktionieren, ist aber nicht wirklich richtig. Ich hatte eher gemeint, dass du mal die Manpage zu htonl durchliest und guckst, wie das richtig geht. Hast du jemals die Manpages zu den Funktionen gelesen, die du hier benutzt? So langsam bekomme ich den Eindruck, du hast bloß Codebeispiele aus dem Internet zusammenkopiert ohne sie richtig zu verstehen.
Belli schrieb:
Das wundert mich, denn send (zumindest das send, das ich kenne) möchte als zweiten Parameter einen Zeiger auf
charvoid.FTFY
.
-
Nö, das send, das ich kenne, ist das hier:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx
und das möchte char *.
-
knivil schrieb:
Kompilierbar != fehlerfreies Programm.
Das ist mir klar, gerade darum bin ich hier.
Vielen Dank für den Link, ich bin gerade fleißig am lesen.Wer sagt, dass du das nicht kannst?
Zwei Posts über dir steht das, daher meine Frage.
Sorry mit dem htons, ich habe es nachgelesen.
int sendNachricht(int fd, struct Nachricht nachr) { int tmpsend; nachr.date = htonl(nachr.date); nachr.user = htons(nachr.user); /* data muss offensichtlich nicht umgewandelt werden */ tmpsend = send(fd, (char *) &nachr, sizeof nachr,0); return tmpsend; }
Welche "Version" von send ist nun korrekt?
Das ich nicht alles verstehe ist schon richtig, daher bin ich auch hier.
Was ich verstanden habe:
Zuerst nehme ich die Nachricht und wandle sie um (wegen little/big endian).
Umgewandelt werden müssen short, int und long. Anschließend versende ich die Nachricht, unter Angabe des Sockets, der Nachricht (?), der Größe und Flags. Die Rückgabe von send() ist die Größe des versendeten Nachricht.Wie gesagt, ich bin nicht fit in C, würde aber das Problem gerne lösen und bin nebenbei fleißig am lesen. Es wäre super, wenn mir jemand sagen kann, ob der Lösungsvorschlag und welche Version von send korrekt ist.
Vielen Dank
-
modk schrieb:
Es wäre super, wenn mir jemand sagen kann, ob der Lösungsvorschlag und welche Version von send korrekt ist.
Der Lösungsvorschlag sieht nicht direkt verkehrt aus. Probier es doch einfach mal aus. Welche Version von send korrekt ist, kommt auf dein Betriebssystem an. Das ist kein Standard-C. Daher: Referenzen angucken! Die Referenz für Windows' send wurde dir bereits verlinkt, die Referenz für Linux' send solltest du selbstständig finden können.
-
Vielen Dank für deine Antwort SeppJ!
Mit dem ausprobieren hapert es bei mir ganz stark. Muss ich dafür nicht das komplette System aufbauen? Also die Clienten- und Server- Seite? D.h. den socket erschaffen, binden, listen, usw.? Ich habe Probleme mit dem Senden, auf anhieb bekomme ich das alles drumherum nicht hin. Daher habe ich solche Probleme mit dem ausführen, kompilieren geht jedoch.
Danke auch für den Hinweis, dass das send() vom Betriebssystem abhängig ist.
-
Wenn nur little endian Architekturen im Soiel sind, dann braucht keine Konvertierung stattfinden.