Seite 1 von 1

select() auf Windows portieren

Verfasst: 04.04.2011, 02:44
von Halan
Ahoi,

ich versuche gerade meinen Netzwerk-Code auf Windows zu portieren und bin auf ein kleines Problem gestossen. Meine Implementation benutzt select() und das ganze funktioniert unter Linux auch super. Wenn ich das ganze unter Windows Teste gibt select() immer 0 zurück.

Verhält sich select() unter Windows irgendwie anders? Soweit ich weiß, ja eigentlich nicht. Muss ich vielleicht erst connect() aufrufen bevor ich überprüfe ob der socket schreibbar ist? Das mach ich unter Linux nämlich anders herum. Sprich, ich rufe erst select() auf und nur wenn der socket schreibbar ist ruf ich connect() auf. Aber wie gesagt unter Windows gibt select() immer 0 zurück ich kann also nie schreiben.

Noch zur info ich benutze blockierende Sockets und keine Asynchronen Windows-Funktionen, sonder das Standart select().

Hoffe auf eure Hilfe.

gruß,
Halan

EDIT: Ihr könnt euch den Code auch anschauen: http://bazaar.launchpad.net/~kai-mast/y ... CPPort.cpp
Wichtig ist eigentlich nur connect() und update(). Connect wir eben zu Anfang aufgerufen und update() dann jedes Update.

Re: select() auf Windows portieren

Verfasst: 04.04.2011, 08:44
von dot
Was macht das für einen Sinn auf einen Socket schreiben zu wollen der noch nichtmal versucht hat irgendwohin zu connecten!?

Re: select() auf Windows portieren

Verfasst: 04.04.2011, 10:52
von eXile
Halan hat geschrieben:Aber wie gesagt unter Windows gibt select() immer 0 zurück ich kann also nie schreiben.
Kehrt select sofort zurück oder wartet es time lange ab? Im letzteren Fall sollte man sich noch einmal die Blockierungsoptionen unter Windows anschauen, die laufen, glaube ich, etwas nicht-standardkonform.
dot hat geschrieben:Was macht das für einen Sinn auf einen Socket schreiben zu wollen der noch nichtmal versucht hat irgendwohin zu connecten!?
So wie ich das sehe, macht er das nicht, weil er gemäß Zeile 321 gar nicht irgendwo etwas hinschicken kann.

Re: select() auf Windows portieren

Verfasst: 04.04.2011, 11:31
von Halan
dot hat geschrieben:Was macht das für einen Sinn auf einen Socket schreiben zu wollen der noch nichtmal versucht hat irgendwohin zu connecten!?
Weil unter UNIX das connecten auch eine Schreiboperation ist..?

Man benutzt ja select() um eben das blockieren der Sockets zu verhindern. Auch connect kann blockieren wenn man gerade auf den socket nicht schreiben kann. Würde ich es also sofort aufrufen würde das den ganzen Programmablauf aufhalten...

Re: select() auf Windows portieren

Verfasst: 04.04.2011, 12:59
von Lynxeye
Warum solltest du auf ein Socket, welches noch nicht verbunden ist, nicht schreiben können? Erst das connect() ist doch eine Aktion, die das Socket blockieren kann.

Re: select() auf Windows portieren

Verfasst: 07.04.2011, 02:55
von Halan
Lynxeye hat geschrieben:Warum solltest du auf ein Socket, welches noch nicht verbunden ist, nicht schreiben können? Erst das connect() ist doch eine Aktion, die das Socket blockieren kann.
Ja genau so mein ich das ja. Ich rufe connect() eben nur auf wenn der socket schreibbar ist und damit nicht blockiert.

Wie gesagt, der Code funktioniert unter Linux super. Unter Windows leider nicht.

Ist select() unter windows überhaupt so ideal oder sollte ich da lieber die Windows-spezifische API benutzen mit asynchronen callbacks etc? Wär natürlich etwas umständlich umzusetzten weil ich dann einen ganz anderen Code für die Windows-Version verwenden müsste.

Re: select() auf Windows portieren

Verfasst: 07.04.2011, 09:10
von dot
Naja, Winsock bietet dir bessere Möglichkeiten als select(). Genaueres findest du hier: http://tangentsoft.net/wskfaq/articles/ ... egies.html. Von select() ist sogar eher abzuraten...