2016-03-22 9 views
5

İstemcimde IOCP kullanıyorum, ancak sunucuya bağlanırken engelleme çağrısı kullanmak daha kolay. IOCP ile çalışırken, ConnectEx() engelleme yerine WSAConnect() engellemesinin kullanılmasında herhangi bir sorun var mı?WSAConnect() vs ConnectEx()

+3

Senkronize I/O istiyorsan neden IOCP kullanıyorsunuz? – Mat

+0

@Mat Eğer iyi bir şekilde anlarsam OP, kolaylık sağlamak için 'bağlan' çağrısının engellenmesini önemser. @OP Hiçbir şey, hala engelleyici davranışlar elde ederken IOCP'yi kullanmak için 'ConnectEx' ile bir“ geleceği ”ve“ vaat ”bloke etmenizi engeller. –

+0

@Veronika Prüssels * "@ Mat Eğer iyi anlarsam OP, kolaylık nedenleriyle engellemek için bağlanmak için aramayı önemser." * Evet, istediğim bu. * "OP Hiçbir şey, ConnectEx'i engelleyici bir gelecekle karıştırmanızı ve hala engelleme davranışını sürdürürken IOCP'yi kullanmaya söz vermenizi engeller." * Bu ne anlama geliyor ?! – user6088487

cevap

4

Evet, gayet iyi.
WSAConnect numaralı telefona yapılan bir çağrı, bağlantı oluşturuluncaya/bir hata oluşana kadar kilitlenecektir. daha sonra, eşzamanlı IO yapabilir ve tamamlanmış paketler hakkında uygulamanızı IOCP ile bildirimde bulunabilirsiniz. IOCP, WSAConnect ile ilgili herhangi bir paket vermeyecektir.

Bir başka nokta da IOCP'nin Çakışan IO ile heyecanla çalıştığıdır. İşleviniz OVERLAPPED yapısının (WSAConnect gibi) herhangi bir bellek konumunu tüketmiyorsa, IOCP'nin bu API çağrısı ile ilgilenmeyeceğinden emin olabilirsiniz. OVERLAPPED tedarik edilmiş olsa bile, bu eylemin senkronize olmadığı ve IOCP'de yayınlanacağı anlamına gelmez.

C++ için Boost.Asio ve C için libuv'a bir göz atmak isteyebilirsiniz, bu durumda kod da taşınabilir olacaktır (ve daha az buğu). Başka bir intresting platformu çapraz platform olan microsoft Casablanca, ama tecrübemde performans felaket.

+0

* "OVERLAPPED sağlanmış olsa bile, bu eylemin zaman uyumsuz olduğu ve IOCP'de yayınlanacağı anlamına gelmez" * Bunun ne demek istediğini açıklayabilir misiniz Beyan. Örneğin, "WSARecv()" işlevini çağırabilir ve bir "OVERLAPPED" yapısını geçirebilir ve bir tamamlama paketi alamaz mıyım? Örneğin, – user6088487

+0

, "ReadFile" ve "WriteFile", "OVERLAPPED" işlevini alır; Eşzamanlı olmayan eylemler için dosya tanıtıcısı açılmamışsa, bu eylem eşzamanlı olarak tamamlanır. –

+0

da, IO paketlerini almak için Sapı IOCP'ye açıkça bağlamanız gerekir. Bu nedenle, IOCP'nin devam etmesini sağlamak için aşağıdaki koşullara ihtiyacınız olduğu sonucuna varmak için: 1) asenkron IO 2) destekleyicinin, tanıtıcıyı IOCP 3) 'OVERLAPPED' yapılarını kullanan işlevle ilişkilendirmesini sağlayabilirsiniz. koşullardan biri geçerli değilse, IOCP bu işlev için tekme yapmayacaktır –

İlgili konular