2008-12-28 12 views
5

Ich portiere Code von BSD-Sockets nach Winsock, und ich bin mir nicht sicher, wie ich den folgenden Fall behandeln soll.Mischen von Dateigriffen und Sockets in Winsock

Meine ursprüngliche Anwendung läuft eine Auswahl sowohl stdin und die Netzwerkbuchse:

FD_SET(sock, &fd); 
FD_SET(0, &fd); 
... 
if (select(..., &fd, ...)...) 

Der Versuch, dies in Winsock zu laufen gibt einen Fehler 10038 (WSAENOTSOCK), was Sinn macht, da das, was war Datei-Handle 0 in Linux (stdin) ist kein Socket (genauer: ein SOCKET-Typ) in Windows.

Gibt es eine einfache Möglichkeit, diesen Test auf Windows-Sockets zu portieren?

Antwort

1

Winsocks select() funktioniert nur mit Sockets. Eine weitere 'Windows-y'-Alternative wäre die Verwendung von Asynchronous I/O an beiden Handles und dann WaitForMultipleObjects.

+0

danke Max. Ich werde das heute versuchen. Es ist ein bisschen eine Schande, obwohl; Ich hatte gehofft, eine Winsock-Portierungsschicht zu haben; Es scheint, als würde dies ein bisschen mehr von einer Neufassung erfordern, die ich mir vorgestellt hatte. Naja. – Mikeage

+1

Sie können Overlapped IO für ein Handle nur verwenden, wenn es auf eine spezielle Weise erstellt wurde. Dies bedeutet insbesondere, dass Sie überlappende IO für geerbte Handles wie die drei Standardstreams nicht verwenden können. –

2

Ich würde gerne korrigiert werden, aber soweit ich weiß, reicht Winsock nicht über das Reich der Sockets hinaus. Das heißt, Unix's Philosophie "alles ist eine Datei" für die Systemaufrufe select(), read(), write() usw. ist in Winsock nicht vorhanden.

Ich bin mir sicher, dass Sie etwas Ähnliches nur mit der Win32-API tun können, die an Socket- und Konsolen-Handles arbeitet, aber es wird nicht mehr wie Winsock (oder BSD) aussehen.

+0

Ich denke, du hast Recht, aber ich hoffe nicht; darum habe ich gefragt. Das Problem ist, dass ich zwei verschiedene Eingabequellen scannen muss, und kümmern mich um die erste, die Daten enthält. select() in Unix macht es einfach; Ich weiß jedoch nicht, wie ich das in Windows machen soll (und ich möchte kein Cygwin). – Mikeage

+0

Verdammt. Ich würde Cygwin als nächstes vorschlagen. :) –

+0

Ich portiere eine Anwendung, die bereits mit Cygwin kompiliert, aber ich möchte auch eine MinGW-Lösung. An eine bestimmte cygwin1.dll auf einem System mit vielen gebunden ist nie Spaß. – Mikeage