目前需要一個客戶端同時連接30-40個服務器,使用for回圈依次connect服務器,這樣也可以實作,就是如果其中有大量服務器地址路由不可達或者連接不順利的情況下,會耗費大量時間,因為windows connect阻塞模式一臺是25秒,30-40臺經計算和測驗需要10多分鐘。自己用非阻塞方式又不穩定。請問下大神有什么即穩定又快速點的方法?
uj5u.com熱心網友回復:
你不用執行緒嗎?執行緒+事件驅動
uj5u.com熱心網友回復:
我是考慮用多執行緒來實作,但是原本for中依次connect的代碼,單獨封裝在執行緒函式中后也會不穩定,還有訊息驅動大概是什么思路?能具體點嗎uj5u.com熱心網友回復:
非阻塞模式不穩定?沒有看明白。
低效的主要問題是使用的阻塞方式,例外時需要等待timeout回傳
建議改成多執行緒和異步方式,就是把原來單個執行緒回圈連接server的作業
分到多個執行緒中去,并行處理。
uj5u.com熱心網友回復:
僅供參考:#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
FILE *f;
char fn[40];
char ln[80];
char yn;
int n;
yn='N';
sprintf(fn,"d:\\ping%d.txt",k);
f=fopen(fn,"r");
if (NULL!=f) {
n=0;
while (1) {
if (NULL==fgets(ln,80,f)) break;//
if (strstr(ln,"ms ")) {
yn='Y';
break;//
}
n++;
if (n>=4) break;//
}
fclose(f);
}
return yn;
}
void main(int argc,char **argv) {
char cmdstr[256];
int i;
int IP[3];
char c;
if (argc<2) {
USAGE:
printf("Usage example:\n %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
return;
}
if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
if (0<=IP[0] && IP[0]<=255
&& 0<=IP[1] && IP[1]<=255
&& 0<=IP[2] && IP[2]<=255
&& '.'==c) {
for (i=1;i<255;i++) {
sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
WinExec(cmdstr,SW_HIDE);
}
Sleep(3000);
for (i=1;i<255;i++) {
printf("%c %s%d\n",YN(i),argv[1],i);
}
Sleep(3000);
WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
} else goto USAGE;
} else goto USAGE;
}
uj5u.com熱心網友回復:
先ping一下在connect不行么?uj5u.com熱心網友回復:
1,用執行緒完成2,客戶端用完成埠異步連接即可
uj5u.com熱心網友回復:
我樓上已經說的比較明白了uj5u.com熱心網友回復:
這種情況我覺得要么使用執行緒,要么還是采用異步的方式。其實只選其一都可以uj5u.com熱心網友回復:
你可以用異步方式,connect采用select模型試試~uj5u.com熱心網友回復:
你只是測驗網路服務器是否可用,并不是真的需要連接并與之通訊?這樣的話,可以用CAsyncSocket異步模式,建立批量的socket,然后for回圈嘗試連接,連接操作本身會立即回傳,但是每個連接是否成功有可能需要等20-30秒(連接超時后)才能獲得結果,如果連接成功,則幾秒內就能獲得結果。好處就是等待的開銷是重疊的,就是幾十個連接都是相同時刻開始等待的,總共可能只需要不到40秒就獲得全部結果了。
但這個方法很笨。
還有更簡單的方法,發送UDP廣播來列舉局域網內的可用ip。采用多執行緒方式,可以瞬間獲得結果。
http://bbs.csdn.net/topics/391046264
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/153532.html
標籤:網絡編程
下一篇:h264實時播放問題
