Frage zu TCP buffer size und completion ports + WSARecv
-
Hehe, nix Neues. Man versteht mich nicht...
@MisterX
Danke, das weiß ich. Mir geht es aber um die buffer size, also wie viel man auf einmal der Funktion übergeben kann, oder ist es wirklich nur auf sizeof(int) begrenzt?@theta
Danke, das weiß ich.
Beispiel: Nehmen wir an, es gibt 2 Worker-Threads (GetQueuedCompletionStatus). Kann es vorkommen, dass plötzlich beide Threads gleichzeitig eine completion msg bekommen, und zwar von ein und dem selben socket? zB. werden gerade zwei WSARecv() Aufrufe fertig, beide von einem einzigen socket.Mir gehts halt nur darum, ob ich da synchronisieren muss.
-
@hi
sizeof int ist aber bei deinem sys ganz bestimmt 4byte.und nicht 2, bzw. 65535dec.und sommit gibt es einen wertbereich von, 0xFFFFFFFF hex.
lowbyte
-
Irgendwo auf http://lenholgate.com dürftest du die Antworten finden.
-
Hmm ich find nix

-
Beispiel: Nehmen wir an, es gibt 2 Worker-Threads (GetQueuedCompletionStatus). Kann es vorkommen, dass plötzlich beide Threads gleichzeitig eine completion msg bekommen, und zwar von ein und dem selben socket? zB. werden gerade zwei WSARecv() Aufrufe fertig, beide von einem einzigen socket.
Hmm.. sagen wirs mal so:
Completion's sind ja das Ergebnis einer asynchron ausgeführten Operation.
Das heisst in deinem Fall: Wenn Du zwei mal WSARecv(..) auf demselben Socket aufrufst, kommen zwei Completion's, welche auf verschiedenen Threads sein können und die Reihenfolge muss nicht der Reihenfolge der Aufrufe von WSARecv(..) entsprechen.Ein gängiges Pattern ist, auf einem Socket WSARecv(..) aufrufen, warten bis die Completion eintritt und danach wieder WSARecv(..) aufrufen, uns so weiter.
Simon
-
Hier steht auch nochmal was dazu:
Handling multiple pending socket read and write operations
-
Ah danke, auch für den Link. Verstehe soweit.
Aber wie das bei codeproject gelöst wird, hab ich leider nicht kapiert. Der Sender setzt die Sequenznummer, oder wie? Und wo wird das "GetNext" und "ProcessAndGetNext" aufgerufen? Ist diese Sequenzierung performant? Ist das üblich, dass das so gemacht wird (bei mehr als einem pending read)?
-
Und noch was:
So wie ich das verstehe, werden die Daten der asynchronen WSASend()-Aufrufe nicht in der Reihenfolge verschickt in der man die Funktion aufruft? Stimmt das?
-
Ne, glaube eher nicht.
Aber was ich noch nicht verstehe: Wie soll man sicherstellen, dass die fertigen WSARecv()-Aufrufe in den Workerthreads auch in der richtigen Reihenfolge verarbeitet werden?
Sendet man zB. nur 2 Bytes an den Server, und der macht draus 2x WSARecv mit jeweils 1 Byte, dann könnte das 1. Byte ankommen, dann das 2. Byte, das 2. Byte zuerst verarbeitet werden und dann erst das 1. Byte
(Nur 1x WSARecv posten möchte ich nicht, angeblich ist es schneller, immer mehr als einen Aufruf ausstehend zu haben).Ich begreifs nicht...
-
Ehh...
MSDN schrieb:
Overlapped Socket I/O
...
WSARecv should not be called on the same socket simultaneously from different threads, because it can result in an unpredictable buffer order.Wie ist das genau gemeint?
Also doch nur max. 1x WSARecv() ausstehend haben?