1、c#怎麼開發一個tcp高並發伺服器
伺服器在調用listen和accept後,就會阻塞在accept函數上
2、C#HttpClient高並發時怎麼解決TCP連接數過多
用一個信號量來控制 semaphore類 new 這個類的時候可以設定成你需要的數量,調用HttpClient方法前從信號量里get,調用後再release,就可以了
3、redhat哪個版本適合高並發連接數,我要實現百萬TCP連接。
哪個版本無所謂,改一下內核參數就行了
4、怎麼解決在window下高並發TCP請求埠被佔用有關問題
執行以下操作之一:
在 Windows XP 或 Windows Server 2003 計算機上的命令提示中輸入以下命令,顯示此計算機上 TCP/IP 協議所使用的活動連接:
復制
netstat -n
這將列出綁定到客戶端計算機的 TCP/IP 地址以及 TCP/IP 地址與遠程伺服器通信所使用的埠。如果列出的埠使用了所有可用的埠,則出現了 TCP/IP 埠耗盡現象。
在基於 Windows Server 2003 的客戶端計算機的命令提示中輸入以下命令,以顯示 TCP/IP 協議所使用的活動連接:
復制
netstat -b
這將列出綁定到客戶端計算機的 TCP/IP 地址、TCP/IP 地址與遠程伺服器通信所使用的埠以及使用這些埠的應用程序。此信息可以幫助您確定那個客戶端應用程序正在使用過多的 TCP/IP 埠。
與 TCP/IP 埠耗盡有關的問題
當客戶端應用程序嘗試使用 TCP/IP 套接字連接到 BizTalk Server,或當 BizTalk 應用程序嘗試使用 TCP/IP 套接字連接到伺服器時,可能會出現類似於下面的情況:
復制
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
- 或者 -
復制
Unable to connect to the remote server
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
當出現這些錯誤時,還可能出現以下問題:
客戶端應用程序可能無法連接到 BizTalk Server。
BizTalk 應用程序服務可能無法連接到遠程 SQL 伺服器。
BizTalk Server 適配器可能無法連接到遠程伺服器。
客戶端應用程序預留的每個埠均佔用內核內存。如果預留了數目超常的客戶端埠,Windows 內核內存的佔用率將相應增加。
原因
如果客戶端計算機中存在數目超常的 TCIP/IP 套接字連接,則客戶端計算機上可能出現 TCP/IP 埠耗盡的情況。如果多個客戶端應用程序都在建立連接,則可能出現這種情況。
如果所有可用的臨時埠都分配給了客戶端應用程序,則客戶端將出現 TCP/IP 埠耗盡的情況。當 TCP/IP 埠耗盡時,將無法預留客戶端埠,並且嘗試通過 TCP/IP 套接字連接到伺服器的客戶端應用程序也將出錯。
在高負載情況下,比處於正常負載時更容易出現 TCP/IP 埠耗盡的情況。
解決方法
執行以下步驟以避免 TCP/IP 埠耗盡及其相關問題:
驗證客戶端應用程序沒有生成過多的 TCP/IP 套接字連接。這一點可以用上面提到的方法來檢查,即在 Windows Server 2003 和 Windows XP 上運行 netstat -n,或者在 Windows Server 2003 和 2008 上運行 netstat -b。
如果某個客戶端應用程序使用了數量超常的 TCP/IP 套接字連接,則應考慮重新設計客戶端應用程序,以便更有效地使用 TCP/IP 套接字連接。
5、怎麼解決在window下高並發TCP請求埠被佔用有關問題
執行以下操作之一:
在 Windows XP 或 Windows Server 2003 計算機上的命令提示中輸入以下命令,顯示此計算機上 TCP/IP 協議所使用的活動連接:
復制
netstat -n
這將列出綁定到客戶端計算機的 TCP/IP 地址以及 TCP/IP 地址與遠程伺服器通信所使用的埠。如果列出的埠使用了所有可用的埠,則出現了 TCP/IP 埠耗盡現象。
在基於 Windows Server 2003 的客戶端計算機的命令提示中輸入以下命令,以顯示 TCP/IP 協議所使用的活動連接:
復制
netstat -b
這將列出綁定到客戶端計算機的 TCP/IP 地址、TCP/IP 地址與遠程伺服器通信所使用的埠以及使用這些埠的應用程序。此信息可以幫助您確定那個客戶端應用程序正在使用過多的 TCP/IP 埠。
與 TCP/IP 埠耗盡有關的問題
當客戶端應用程序嘗試使用 TCP/IP 套接字連接到 BizTalk Server,或當 BizTalk 應用程序嘗試使用 TCP/IP 套接字連接到伺服器時,可能會出現類似於下面的情況:
復制
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
- 或者 -
復制
Unable to connect to the remote server
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
當出現這些錯誤時,還可能出現以下問題:
客戶端應用程序可能無法連接到 BizTalk Server。
BizTalk 應用程序服務可能無法連接到遠程 SQL 伺服器。
BizTalk Server 適配器可能無法連接到遠程伺服器。
客戶端應用程序預留的每個埠均佔用內核內存。如果預留了數目超常的客戶端埠,Windows 內核內存的佔用率將相應增加。
原因
如果客戶端計算機中存在數目超常的 TCIP/IP 套接字連接,則客戶端計算機上可能出現 TCP/IP 埠耗盡的情況。如果多個客戶端應用程序都在建立連接,則可能出現這種情況。
如果所有可用的臨時埠都分配給了客戶端應用程序,則客戶端將出現 TCP/IP 埠耗盡的情況。當 TCP/IP 埠耗盡時,將無法預留客戶端埠,並且嘗試通過 TCP/IP 套接字連接到伺服器的客戶端應用程序也將出錯。
在高負載情況下,比處於正常負載時更容易出現 TCP/IP 埠耗盡的情況。
解決方法
執行以下步驟以避免 TCP/IP 埠耗盡及其相關問題:
驗證客戶端應用程序沒有生成過多的 TCP/IP 套接字連接。這一點可以用上面提到的方法來檢查,即在 Windows Server 2003 和 Windows XP 上運行 netstat -n,或者在 Windows Server 2003 和 2008 上運行 netstat -b。
如果某個客戶端應用程序使用了數量超常的 TCP/IP 套接字連接,則應考慮重新設計客戶端應用程序,以便更有效地使用 TCP/IP 套接字連接。
注意
如果為 BizTalk 應用程序服務 (BTSNTSvc.exe) 實例預留了數量超常的客戶端埠,則需驗證配置為在 BizTalk 應用程序服務中運行的任何自定義代碼都沒有建立過多的 TCP/IP 套接字連接。
如果大量客戶端應用程序要啟動已知數量的 TCP/IP 套接字連接,但沒有足夠數量的可用臨時埠來滿足連接請求,則需要進行以下注冊表修改。
警告
如果注冊表編輯器使用不當,則可能會產生嚴重問題,導致重新安裝操作系統。Microsoft 不保證可以解決因注冊表編輯器使用不當而造成的問題。請慎用注冊表編輯器,風險自負。在修改注冊表之前,請務必備份注冊表,並確保您知道在發生問題時如何使用備份進行還原。有關如何備份、還原及修改注冊表的詳細信息,請參閱 Microsoft 知識庫文章「Microsoft Windows 注冊表說明」,網址為http://go.microsoft.com/fwlink/?LinkId=62729。
增加動態分配到客戶端 TCP/IP 套接字連接的臨時埠的上限。
降低客戶端 TCP/IP 套接字連接的超時值(默認值為 240 秒)
啟動注冊表編輯器。
在注冊表中,瀏覽到並單擊以下注冊表項。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在「編輯」菜單中單擊「新建」、「DWORD 值」,然後添加以下注冊表值,以縮短關閉連接時,該連接處於 TIME_WAIT 狀態的時間。當連接處於 TIME_WAIT 狀態時,套接字對無法重新使用:
值名稱
TcpTimedWaitDelay
值數據
<在此輸入一個 30 到 240 之間的十進制值。>
關閉注冊表編輯器。
注意
必須重新啟動計算機,此更改才會生效。
注意
此值的有效范圍為 30 到 300(十進制)之間。默認值為 240。
啟動注冊表編輯器。
在注冊表中,瀏覽到並單擊以下注冊表項。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在「編輯」菜單中單擊「新建」、「DWORD 值」,然後添加以下注冊表值,以增加可以動態分配到客戶端的臨時埠的數量:
值名稱
MaxUserPort
值數據
<在此輸入一個 5000 到 65534 之間的十進制值>
關閉注冊表編輯器。
注意
必須重新啟動計算機,此更改才會生效。
注意
增加用於客戶端 TCP/IP 連接的臨時埠的范圍將佔用 Windows 內核內存。請勿將此設置的值增加至超過容納客戶端應用程序套接字連接所需要的值,以便盡可能降低對 Windows 內核內存的不必要佔用。
6、如何編寫一個高並發的tcp server
伺服器在調用listen和accept後,就會阻塞在accept函數上,accpet函數返回後循環調用accept函數等待客戶的TCP連接。如果這時候又大量的用戶並發發起connect連接,那麼在listen有隊列上限(最大可接受TCP的連接數)的情況下,有多少個connect會成功了。試驗證明,當連接數遠遠高於listen的可連接數上限時,客戶端的大部分TCP請求會被拋棄,只有當listen監聽隊列空閑或者放棄某個連接時,才可以接收新的連接,那麼我們應該如何來避免這種情況出現?
分析:
(一)客戶端
客戶端運行初期完成所設定的一定量的socket創建和相應的處理線程的創建,然後使用條件變數來完成線程同步,直到最後一個線程創建完成,才向所有線程發出廣播通知,讓所有線程並發調用connect,連接成功則關閉連接,失敗則返回,如下代碼所示。
socket創建和線程創建:
int testCount=300; //並發用戶數
/*
每個進程需要自己獨立的棧空間,linux下默認棧大小是10M,在32位的機子上一個進程需要4G的內存空間,去掉自己的棧空間全局程序段空間,一般只有3G內存可以用,創建線程時就需要從這3G的空間中分配10M出來,所以最多可以分配300個線程。當然這里還可以使用多個進程,每個進程300個線程的方式來進一步擴大並發量。
*/
int sockfd[testCount];
pthread_t ntid[testCount];
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERVER_PORT);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
int testCaseIndex=0;
for(testCaseIndex=0;testCaseIndex<testCount;testCaseIndex++)
{
sockfd[testCaseIndex]=socket(AF_INET,SOCK_STREAM,0);
//為每個並發客戶端創建一個socket
if(sockfd[testCaseIndex]==-1)
{
printf("socket established error: %s\n",(char*)strerror(errno));
return -1;
}
if( pthread_create(&ntid[testCaseIndex],NULL,handleFun,&sockfd[testCaseIndex])!=0)
{
printf("create thread error :%s\n",strerror(errno));
return -1;
}
//為每個並發客戶端創建一個線程來執行connect
}
printf("%d client has initiated\n",testCaseIndex);
並發客戶端的線程實現:線程阻塞在條件變數上(只有條件滿足了並且發起喚醒動作,線程才開始執行)。
int sockfd=*((int*)arg);
{
pthread_cond_wait(&cond,&mut);
//在條件變數上等待條件滿足!
//阻塞返回後立即解鎖,防止互斥量加鎖帶來的阻塞
pthread_mutex_unlock(&mut);
int conRes=0;
conRes=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
//線程執行connect連接,每個線程在接到喚醒信號後,才可以執行該語句,來模擬多個線程的並發調用。
if(conRes==-1)
{
printf("connect error: %s\n",strerror(errno));
return 0;
}
}
當條件滿足時,喚醒阻塞在條件變數上的線程:
while(1)
{
sleep(2);
pthread_cond_broadcast(&cond); //在所有線程創建完成後才進行喚醒。
7、C#HttpClient高並發時怎麼解決TCP連接數過多
用信號量控制
semaphore類
new 類候設定需要數量調用HttpClient前信號量get調用再release
-
8、C#HttpClient高並發時怎麼解決TCP連接數過多
用一個信號量來控制
semaphore類
new 這個類的時候可以設定成你需要的數量,調用HttpClient方法前從信號量里get,調用後再release,就可以了
9、求教面向大規模連接的高並發網路模型,該如何處理
所謂並發伺服器就是在同一個時刻可以處理來自多個客戶端的請求;循環伺服器是指伺服器在同一時刻只可以響應一個客戶端的請求。而且對於TCP和UDP套接字,這兩種伺服器的實現方式也有不同的特點。
1、TCP循環伺服器:
首先TCP伺服器接受一個客戶端的連接請求,處理連接請求,在完成這個客戶端的所有請求後斷開連接,然後再接受下一個客戶端的請求。創建TCP循環伺服器的演算法如下:
復制代碼 代碼如下:
socket(……); //創建一個TCP套接字
bind(……); //邦定公認的埠號
listen(……); //傾聽客戶端連接
while(1) //開始循環接收客戶端連接
{
accept(……);//接收當前客戶端的連接
while(1)
{ //處理當前客戶端的請求
read(……);
process(……);
write(……);
}
close(……); //關閉當前客戶端的連接,准備接收下一個客戶端連接
}
TCP循環伺服器一次只處理一個客戶端的請求,如果有一個客戶端佔用伺服器不放時,其它的客戶機連接請求都得不到及時的響應。因此,TCP伺服器一般很少用循環伺服器模型的。
2、TCP並發伺服器:
並發伺服器的思想是每一個客戶端的請求並不由伺服器的主進程直接處理,而是伺服器主進程創建一個子進程來處理。創建TCP並發伺服器的演算法如下:
復制代碼 代碼如下:
socket(……); //創建一個TCP套接字
bind(……); //邦定公認的埠號
listen(……);//傾聽客戶端連接
while(1) //開始循環接收客戶端的接收
{
accept(……);//接收一個客戶端的連接
if(fork(……)==0) //創建子進程
{
while(1)
{ //子進程處理某個客戶端的連接
read(……);
process(……);
write(……);
}
close(……); //關閉子進程處理的客戶端連接
exit(……) ;//終止該子進程
}
close(……); //父進程關閉連接套接字描述符,准備接收下一個客戶端連接
}
TCP並發伺服器可以解決TCP循環伺服器客戶端獨占伺服器的情況。但同時也帶來了一個不小的問題,即響應客戶機的請求,伺服器要創建子進程來處理,而創建子進程是一種非常消耗資源的操作。
3、UDP循環伺服器:
UDP伺服器每次從套接字上讀取一個客戶端的數據報請求,處理接收到的UDP數據報,然後將結果返回給客戶機。創建UDP循環伺服器的演算法如下:
1 socket(……); //創建一個數據報類型的套接字 2 bind(……); //邦定公認的短口號 3 while(1) //開始接收客戶端的連接 4 { //接收和處理客戶端的UDP數據報 5 recvfrom(……); 6 process(……); 7 sendto(……);//准備接收下一個客戶機的數據報 8 }
消除行號
因為UDP是非面向連接的,沒有一個客戶端可以獨占伺服器。只要處理過程不是死循環,伺服器對於每一個客戶機的請求總是能夠處理的。
UDP循環伺服器在數據報流量過大時由於處理任務繁重可能造成客戶技數據報丟失,但是因為UDP協議本身不保證數據報可靠到達,所以UDP協議是允許丟失數據報的。
鑒於以上兩點,一般的UDP伺服器採用循環方式4、UDP並發伺服器把並發的概念應用UDP就得到了並發UDP伺服器,和並發TCP伺服器模型一樣是創建子進程來處理的。
創建UDP並發伺服器的演算法如下:
復制代碼 代碼如下:
socket(……); //創建一個數據報類型的套接字
bind(……); //邦定公認的短口號
while(1) //開始接收客戶端的連接
{ //接收和處理客戶端的UDP數據報
recvfrom(……);
if(fork(……)==0) //創建子進程
{
rocess(……);
sendto(……);
}
}
除非伺服器在處理客戶端的請求所用的時間比較長以外,人們實際上很少用這種UDP並發伺服器模型的。
4、多路復用I/O並發伺服器:
創建子進程會帶來系統資源的大量消耗,為了解決這個問題,採用多路復用I/O模型的並發伺服器。採用select函數創建多路復用I/O模型的並發伺服器的演算法如下:
初始化(socket,bind,listen);
復制代碼 代碼如下:
while(1)
{
設置監聽讀寫文件描述符(FD_*);
調用select;
如果是傾聽套接字就緒,說明一個新的連接請求建立
{
建立連接(accept);
加入到監聽文件描述符中去;
}
否則說明是一個已經連接過的描述符
{
進行操作(read或者write);
}
多路復用I/O可以解決資源限制問題,此模型實際上是將UDP循環模型用在了TCP上面。這也會帶了一些問題,如由於伺服器依次處理客戶的請求,所以可能導致友的客戶會等待很久。
10、C#HttpClient高並發時怎麼解決TCP連接數過多
採用非同步處理。Socket非同步處理是出來大並發連接數量的不二選擇。非同步處理本質上是多線程的,而且使用線程池。藉助線程池能夠提供線程處理性能。根據1)和2)分析的結果有可能需要調整線程池默認線程數量。