[英]alternatives to winsock2 with example server source in c++
我正在使用http://tangentsoft.net/wskfaq/examples/basics/select-server.html上的這個示例實現
這正在做我需要的大部分工作,處理連接而不會阻塞,並且所有工作都在其線程中(不像某些示例那樣為每個連接創建新線程),但我擔心因為我被告知winsock只會支持最多64個客戶端連接:S
這64個連接是真的嗎?
我還有其他選擇嗎? 為類似的實現提供一個c ++示例會很酷。
謝謝
替代圖書館:
你應該考慮使用boost asio 。 它是一個跨平台的網絡庫,簡化了您可能需要完成的許多任務。
關於64限制:
通過良好的設計,您將體驗到64硬連接限制。 基本上,如果您使用某種線程模型,您將不會遇到此限制。
以下是您聽到的限制的一些信息:
4.9 - “64插座”限制是什么?
有兩個64插槽限制:
Win32事件機制(例如WaitForMultipleObjects())一次只能等待64個事件對象。 Winsock 2提供了WSAEventSelect()函數,它允許您使用Win32的事件機制來等待套接字上的事件。 因為它使用Win32的事件機制,所以您一次只能等待64個套接字上的事件。 如果要一次等待超過64個Winsock事件對象,則需要使用多個線程,每個線程等待不超過64個套接字。
select()函數在某些情況下也限制為一次等待64個套接字。 winsock.h中定義的FD_SETSIZE常量確定傳遞給select()的fd_set結構的大小。 它默認定義為64.您可以在#include winsock.h之前將此常量定義為更高的值,這將覆蓋默認值。 不幸的是,至少有一個非Microsoft Winsock堆棧和一些分層服務提供商假設默認值為64; 在較大的fd_sets中,它們將忽略超過64位的套接字。
您可以編寫一個測試程序,在您計划支持的系統上嘗試此操作,以查看它們是否不受限制。 如果是,您可以使用線程來解決這個問題,就像使用事件對象一樣。
@布賴恩:
if ((gConnections.size() + 1) > 64) {
// For the background on this check, see
// www.tangentsoft.net/wskfaq/advanced.html#64sockets
// The +1 is to account for the listener socket.
cout << "WARNING: More than 63 client "
"connections accepted. This will not "
"work reliably on some Winsock "
"stacks!" << endl;
}
致OP:
你為什么不想使用winsock2? 您可以嘗試使用IOCP來構建自己的服務器,盡管使這個跨平台變得有點棘手。 你可以像Brian建議的那樣看看Boost :: asio。
在您決定需要'winsock2的替代品'之前,請閱讀: Microsoft Windows網絡編程 。
總之,您不需要“替代Winsock2”,您需要了解如何使用提供的編程模型在您所定位的平台上完全生效。 然后,如果你真的需要使用異步I / O的跨平台套接字代碼,那么看看ASIO,但是,如果你真的不需要跨平台代碼,那么考慮一些實際上關注你可能在平台上遇到的問題的東西。你需要專注於 - 特別是某些特定於Windows的東西。 回到上面提到的那本書,看看你有各種選擇。
最高性能和可擴展的選項是使用IO完成端口。 我已經可以通過一些免費的代碼在這里 ,使得它很容易編寫擴展和在Windows(NT)基於平台運行良好的服務器; 鏈接頁面還鏈接到我寫過的關於此的一些文章。 我的框架與ASIO的比較可以在這里找到: http : //www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.