2009-02-10 10 views
5

GetFileType()==FILE_TYPE_PIPE kodunun bir soket oluşturup oluşturmayacağını saptamam gerekir. Bunun için bir API görünmemektedir.Win32 yuvası tutamacı diğer boru tutamaçlarından nasıl ayırt edilir?

Aşağıdakileri denedim. Genel fikir, sokete özgü bir işlev kullanmak ve başarısızlığı yuva olmayan anlam olarak ele almaktır.

  • getsockopt() - Bu benim ilk denememdi. Ne yazık ki aynı (non-socket) tanıtıcı üzerinde birçok iş parçacığı tarafından çağrıldığında asılı gibi görünüyor.
  • WSAEnumNetworkEvents() - Gnulib'in yaptığı şey budur ancak eğer kolu soket ise istenmeyen yan etkilere sahiptir.
  • getpeername() - cygwin'in yaptığı şey budur, ancak bu durum bazı soketler için de başarısız olacaktır. Bir hatanın soketle ilgili olup olmadığını tahmin etmek güvenilir ve gelecekteki güvenli görünmüyor.

Çözümün yalnızca Windows'un bazı sürümlerinde çalışıp çalışmadığını sorun değil, ör. Vista, genel davada her zaman başka bir yönteme geri dönebilirim.

cevap

1

WSADuplicateSocket'u denediniz mi? Daha sonra,

+0

Hayır. Denerim, teşekkürler. –

2

GetNamedPipeInfo() kolunuzda arama yapmayı deneyebilirsiniz diye düşünmek için WSAPROTOCOL_INFO'a bakın. Çağrı başarılı olursa, tutamacın bir boru kolu olduğunu biliyorsunuz, aksi halde bir yuva olması gerekir.

+0

Teşekkürler. Bu, sokete özgü işlevleri (soket olmayanlar için askıda olduğu bilinen) kullanmaktan daha güvenli olabilir. –

0

GetLamError() ile sonucu değerlendirerek GetNamedPipeHandleState() yöntemini de kullanabilirsiniz.

İlgili konular