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?
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?
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.
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.
@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.
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.
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)?
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.