verständnisproblem sockets
-
hallo,
ich hab anhand diverser tutorials mal versucht ein bissl mit sockets herum zu spielen. aber irgendwie hab ich noch diverse verständnisprobleme was die sache angeht.
also was ich hab ist ein server, der an einem port lauscht, und folgendes Protokoll benutzt:dta_Server = socket(AF_INET, // Go over TCP/IP SOCK_STREAM, //This is a stream-oriented socket IPPROTO_TCP);dann mache ich einen asynchronen socket daraus:
// Make socket async socket nret = WSAAsyncSelect(dta_Server, hWnd, DTA_SOCKET_MESSAGE, REPORTED_SOCKET_EVENTS);und kann auch in meiner WNDPROC prima mittels der empfangenen Messages auf Ereignisse reagieren. Eine Verbindung mit Hyperterminal (Client) kommt zu stande und auch Daten werden empfangen (vom Server).
Nun aber zu meinen Fragen:
1. Ich würde gerne Daten einer definierten Paketgröße verschicken, z.B. 1024 bytes, die dann ein struct darstellen z.B. sowas
struct PAKET { DWORD PacketType; DWORD res1; DWORD res2; char PacketData[1012]; };und auf der anderen Seite auch so empfangen. Gibt es da Mittel und wege?
Wenn ich z.B. 1024 zeichen mittels Hyperterminal übertrage, kommen die in mehreren Paketen unterschiedlicher/zufälliger Größe an. Manchmal kommen sogar 1 byte Pakete. Liegt das daran dass mein Server asynchron arbeitet?
Würde ich, wenn ich blockierend lesen würde dann das komplette Paket am Stück empfangen? Ich glaube nicht unbedingt oder? Weil MSDN sacht das:For connection-oriented sockets (type SOCK_STREAM for example), calling recv will return as much information as is currently available—up to the size of the buffer specified
2. Wie kann ich es realisieren, dass ich über eine "Leitung" Senden UND Empfangen kann? Also eine Art simples Protokoll implementieren. Sollte ich dazu blockierendes Lesen verwenden und zum Bsp auf Client Seite immer abwechselnd Schreiben und danach Lesen (sozusagen schauen was der Server antwortet)? Aber falls ja, wie kann ich dann sicher stellen, dass ich auch alles vom Server erhalten hab? Soll ich auf Client-Seite mit dem Flag MSG_PEEK solange in einer Schleife warten, bis die 1024 bytes anliegen?
3. Ist von Protokollebene her gesichert, dass die Daten auch in der Reihenfolge ankommen wie ich sie Sende?
...so ich denke das reicht erst mal. Wäre Prima wenn jemand ein paar brauchbare Tipps hat, oder einen guten Link. Weil alle Tutorials die ich finde immer nur so an der Oberfläche rumkratzen und die allernötigsten Basic bringen. Aber bis zu so einer Art "Protokoll" ist es ja doch noch eine Ecke hin und da wollt ich einfach mal von Euch wissen, wie man es RICHTIG macht bevor ich wieder anfange rumzupfuschen

-
1. Du musst halt eine Schleife machen, die so lange liest, bis die 1024 Bytes vollständig sind.
2. Ist eigentlich kein Problem. Normalerweise schickt der Server erst was, nachdem der Client eine Anfrage gestellt hat, es wird also immer abwechselnd auf den jeweils anderen gewartet. Und man weiß aufgrund irgendwelcher Regeln, wann die Nachricht der Gegenseite zu Ende ist.
3. Ja.