2008-12-28 23 views
5

BSD yuvalarından Winsock'e bazı kodları yüklüyorum ve aşağıdaki durumun nasıl ele alınacağından emin değilim. ne dosya tanıtıcısı 0 yaşından beri, Winsock bu çalıştırmak çalışıyorWinsock'ta Dosya Kolları ve Yuvaları Karıştırma

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

bir hata 10038 (WSAENOTSOCK) verir, mantıklı:

Benim orijinal uygulama Stdin ve ağ soketi hem seçkin çalışır Linux (stdin), Windows'da bir soket (daha doğrusu: bir SOKET tipi) değildir.

Bu sınama Windows soketlerine yerleştirmenin kolay bir yolu var mı?

cevap

1

Winsock'un select() yalnızca soketli olarak çalışır. Daha fazla 'Windows-y' alternatifi, her iki tutamaçta Asynchronous I/O kullanmak ve sonra WaitForMultipleObjects olacaktır.

+0

teşekkürler Max. Bunu bugün deneyeceğim. Yine de utanç verici; Winsock porting tabakası olmasını umuyordum; Bu, hayal edeceğim biraz daha fazla bir yeniden yazma gerektirecek gibi görünüyor. Oh iyi. – Mikeage

+1

Özel bir yolla oluşturulmadığı sürece Üst üste Çakışan IO'yu bir tanıtıcı üzerinde kullanamazsınız. Bu, özellikle, üç standart akış gibi, devralınan IO'yu devralınan tutamaçlarda kullanamayacağınız anlamına gelir. –

2

Düzeltilmeyi çok isterdim, ama bildiğim kadarıyla Winsock soket alanının ötesine uzanmıyor. Yani, Unix'in "her şey bir dosyadır" felsefesi olan select(), read(), write(), vs sistem çağrıları Winsock'ta yok.

Sadece Win32 API'sı ve konsol tanıtıcıları üzerinde çalışan bir API ile benzer bir şey yaptığınızdan emin olabilirsiniz, ancak artık Winsock (veya BSD) gibi görünmeyecektir.

+0

Sanırım haklısınız, ama umarım; bu yüzden sordum. Sorun şu ki, iki farklı giriş kaynağını taramam ve ilk veriye sahip olmamız gerekiyor. Unix'teki() seçimini kolaylaştırır; Windows'da bunu nasıl yapacağımı bilmiyorum (ve ben cygwin istemiyorum). – Mikeage

+0

Lanet. Sonraki Cygwin'i önerecektim. :) –

+0

Ben zaten cygwin ile derleyen bir uygulama taşıyorum, ama ben de bir MinGW çözümü istiyorum. Bir sistemde belirli bir cygwin1.dll ile bağlı olmak asla eğlencelidir. – Mikeage

İlgili konular