- 論壇徽章:
- 0
|
本帖最后由 whyliyi 于 2011-01-13 17:13 編輯
自己編寫(xiě)了通信程序,基本的通信程序如下:
- /*服務(wù)器*/
- while(1)
- {
- FD_SET(fdListen, &fdset);
- for(i=0; i<MAX_NODE; i++)
- {
- FD_SET(fdRecv[i], &fdset);
- max_fd = max_fd>fdRecv[i] ? max_fd : fdRecv[i];
- }
- overtime.tv_sec = 2;
- overtime.tv_usec = 0;
- ret = select(max_fd+1, &fdset, NULL, NULL, &overtime);
- if( 0 == ret )
- {
- printf("ret = 0\n");
- continue;
- }
- else if( -1 == ret )
- {
- printf("Something Unexpected happened!...\n");
- break;
- }
- if( SOCK_STREAM == fdType && index <= MAX_NODE && FD_ISSET(fdListen, &fdset) )
- {
- for( i=0; i<MAX_NODE; i++ )
- {
- if( 0 == fdRecv[i] &&(fdRecv[i] = AcceptSock(&fdListen, &serAddr)) )
- {
- FD_SET(fdRecv[i], &fdset);
- max_fd = max_fd>fdRecv[i] ? max_fd : fdRecv[i];
- index++;
- break;
- }
- }
- }
- else
- {
- for( i=0; i<MAX_NODE; i++ )
- {
- //printf("\\\\");
- if( FD_ISSET(fdRecv[i], &fdset) )
- {
- //printf("????");
- len = -1;
- cliLen = sizeof(cliAddr);
-
- len = RecvMsg(&fdRecv[i], msgRecv, sizeof(msgRecv), 0, (SA*)&cliAddr);
- if( len < 0 ) //如果<0則認(rèn)為連接已經(jīng)斷開(kāi)
- {
- FD_CLR(fdRecv[i], &fdset);
- fdRecv[i] = 0;
- index --;
- gettimeofday(&end, NULL);
- timeuse = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
- timeuse /= 1000000;
- printf("Time:%f, Total Bits:%f, %fkbps\n", timeuse, total_bits, total_bits/(1000*timeuse));
- break;
- }
- total_packets++;
- if( 1 == total_packets )
- {
- gettimeofday(&start, NULL);
- }
- total_bits += 8*strlen(msgRecv);
- break;
- }
- }
- }
- }
復(fù)制代碼 客戶(hù)端數(shù)據(jù)不間斷發(fā)送,采用TCP連接。
兩臺(tái)PC通過(guò)11G網(wǎng)卡連接。在客戶(hù)端發(fā)送了60000包長(zhǎng)度為1000字節(jié)的數(shù)據(jù),結(jié)果為:
Time:83.566383, Total Bits:480014432.000000, 5744.109206kbps
表示所用時(shí)間為83.566383秒,總共發(fā)送的bit數(shù)為480014432bits,平均速率為5744.109206kbps。
但是,用同樣的網(wǎng)卡、同樣的距離,用飛鴿傳書(shū)傳送一個(gè)文件的速率為2MB/s,即2*8=16Mbps,這是為何?
按理說(shuō),飛鴿是一個(gè)協(xié)議,數(shù)據(jù)的接收發(fā)送都需要解包,而我的發(fā)的純char數(shù)據(jù)的數(shù)據(jù),速率應(yīng)該不會(huì)比我的快才對(duì)阿。
請(qǐng)高手指教! |
|