Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Frage zu TCP buffer size und completion ports + WSARecv     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Hi
Unregistrierter




Beitrag Hi Unregistrierter 13:56:46 01.09.2010   Titel:   Frage zu TCP buffer size und completion ports + WSARecv            Zitieren

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?


:confused:

THX!
MisterX
Unregistrierter




Beitrag MisterX Unregistrierter 17:08:55 01.09.2010   Titel:              Zitieren

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)
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3814
Beitrag theta Mitglied 17:37:16 01.09.2010   Titel:              Zitieren

Zitat:
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.
Hi
Unregistrierter




Beitrag Hi Unregistrierter 18:42:00 01.09.2010   Titel:              Zitieren

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.
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 19:06:05 01.09.2010   Titel:              Zitieren

@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
123
Unregistrierter




Beitrag 123 Unregistrierter 19:45:14 01.09.2010   Titel:              Zitieren

Irgendwo auf http://lenholgate.com dürftest du die Antworten finden.
Hi
Unregistrierter




Beitrag Hi Unregistrierter 20:20:27 01.09.2010   Titel:              Zitieren

Hmm ich find nix :(
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3814
Beitrag theta Mitglied 12:22:54 02.09.2010   Titel:              Zitieren

Zitat:
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
Bye
Unregistrierter




Beitrag Bye Unregistrierter 19:38:04 02.09.2010   Titel:              Zitieren

Hier steht auch nochmal was dazu:
Handling multiple pending socket read and write operations
Hi
Unregistrierter




Beitrag Hi Unregistrierter 20:14:03 02.09.2010   Titel:              Zitieren

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)?
Hi
Unregistrierter




Beitrag Hi Unregistrierter 21:41:21 02.09.2010   Titel:              Zitieren

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?
Hi
Unregistrierter




Beitrag Hi Unregistrierter 20:28:16 04.09.2010   Titel:              Zitieren

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...
Hi
Unregistrierter




Beitrag Hi Unregistrierter 20:47:07 04.09.2010   Titel:              Zitieren

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?
C/C++ Forum :: WinAPI ::  Frage zu TCP buffer size und completion ports + WSARecv   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

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.