Frage zu TCP buffer size und completion ports + WSARecv
-
Hi!
1. Frage:
Wie viele Bytes kann man der Funktion send() oder WSASend() eigentlich übergeben? Ich las mal was von 65535 aber es gehen auch mehr... Und wie wählt man die richtige Buffergröße?2. Frage:
Können bei einem completion port zwei WSARecv() vom selben Socket gleichzeitig in 2 worker threads bearbeitet werden? Oder verhindert Windows das?Hier ( http://msdn.microsoft.com/en-us/library/ms741688 ) liest man zwar:
MSDN schrieb:
For a given socket, I/O completion routines will not be nested.
Aber das "routines" gefällt mir nicht, weils ja noch eine "completion routine" gibt (letzter parameter WSARecv). Also gilt das nun auch für completion ports?

THX!
-
Bei "send" ist nicht einmal sichergestellt, dass auch nur ein einziges byte übergeben werden kann. Daher mußt du das in einer Schleife übergeben und immer abfragen wieviel wirklich übergeben wurde. Und das so lange wiederholen bis alles übergeben wurde.
(Das selbe Problem bnesteht analog auch bei recv)
-
Aber das "routines" gefällt mir nicht, weils ja noch eine "completion routine" gibt (letzter parameter WSARecv). Also gilt das nun auch für completion ports?
Der letzte parameter "completion routine" hat nichts mit IOCP zu tun, sondern mit APC. Du musst mit GetQueuedCompletionStatus(..) das Resultat der geschedulten IOCP Operation abrufen / abwarten.
-
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?