select() auf Windows portieren

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

select() auf Windows portieren

Beitrag 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.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: select() auf Windows portieren

Beitrag von dot »

Was macht das für einen Sinn auf einen Socket schreiben zu wollen der noch nichtmal versucht hat irgendwohin zu connecten!?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: select() auf Windows portieren

Beitrag 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.
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: select() auf Windows portieren

Beitrag 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...
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: select() auf Windows portieren

Beitrag 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.
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: select() auf Windows portieren

Beitrag 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.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: select() auf Windows portieren

Beitrag 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...
Antworten