選擇(select)模型是winsock中最常見的 i/o模型。核心便是利用 select 函式,實現對 i/o的管理!利用 select 函式來判斷某socket上是否有資料可讀,或者能否向乙個套接字寫入資料,防止程式在socket處於阻塞模式中時,在一次 i/o 呼叫(如send或recv、accept等)過程中,被迫進入「鎖定」狀態;同時防止在套接字處於非阻塞模式中時,產生wsaewouldblock錯誤。
select函式原型:
int select(
int nfds,
//傳入引數,忽略
fd_set far * readfds,
//檢查可讀性
fd_set far * writefds,
//檢查可寫性
fd_set far * exceptfds,
//例外資料
const
struct timeval far * timeout //本次select呼叫最長的等待時間);
函式返回值,select()函式呼叫後,返回處於就緒狀態並且已經包含在fd_set結構中的套介面描述符,也就是說,它要修改集合,刪除那些不能進行指定操作的套介面。但如果超時則返回0;如果發生錯誤,則返回socket_error,應用程式可通過wsagetlasterror()獲取錯誤**。
其中fd_set是乙個結構型別說明符,代表著一系列特定套介面的集合,它的定義如下:
typedef
struct fd_set fd_set;
timeval是乙個結構型別,它的定義如下:
struct timeval ;
若將超時值設定為(0 , 0),表明 select 會立即返回,出於對效能方面的考慮,應避免這樣的設定。
以下為測試select()函式的程式,乙個伺服器端兩個客戶端
下面是伺服器端程式:
#define fd_setsize 500
#include
#pragma comment ( lib,
"ws2_32"
)#include
int main()
else
printf(
"①載入成功/n"
);//-------②建立流式套接字------------
socket s= socket( af_inet, sock_stream,
0 );
if( s== invalid_socket)
else
printf(
"②已建立監聽套介面:【%d】/n"
, s);
//將套介面s置於」非阻塞模式「
u_long u1=
1 ;ioctlsocket( s, fionbio,( u_long*)& u1);
//-----------③繫結本地位址---------------------
struct sockaddr_in sadd;
sadd.sin_family= af_inet;
sadd.sin_port= htons(
5555 );
sadd.sin_addr.s_un.s_addr= inet_addr(
"192.168.31.1"
);if
( bind( s,( sockaddr*)& sadd,
sizeof
( sadd))== socket_error)
else
printf(
, inet_ntoa( sadd.sin_addr), ntohs( sadd.sin_port));
//--------------④進入監聽狀態-----------------
if( listen( s,
3 )== socket_error)
else
printf(
"④進入監聽狀態/n"
);//--------------⑤select-------------------
//準備工作
int x=
1 ;timeval tv;
tv.tv_sec=
20 ;
tv.tv_usec=
0 ;fd_set socket_jh01;
fd_zero(& socket_jh01);
fd_set( s,& socket_jh01);
fd_set socket_jh02;
fd_zero(& socket_jh02);
while
(true
)else
}else
else
if( crecv>
0 )else
if( isend<=
0 )else
printf(
"給客戶【%d】資訊已傳送,首席資訊官度%d位元組/n/n"
, socket_jh02.fd_array[ i], isend);
}else}}
//end for
}//end sock_sum
//------------情況二 超時
else
if( sock_sum==
0 )else
}//--------------情況三 失敗
else
}//while end
closesocket( s);
printf(
"退出"
);wsacleanup();
return
0 ;}
兩個客戶端程式與上次測試的客戶端一樣,詳見這裡【tcp流式套接字的阻塞模式程式設計】
先啟動伺服器端,再啟動1號客戶端,接著啟動2號客戶端,就會看到如圖所示:
TCP流式套接字的基本程式設計
面向連線的客戶 伺服器程式工作模型 伺服器端程式 include pragma comment lib,ws2 32 include int main else 建立用於監聽的流式套介面s socket s socket af inet,sock stream,ipproto tcp if s in...
TCP的套接字
摘自 深入理解計算機網路 王達著 機械工業出版社 1.ipv4資料報頭部格式 2.ipv6資料報頭部格式 3.ipv4資料報的封裝與解封裝 4.ipv4資料報的分段與重組 5.arp協議報文格式及arp表 6.arp位址解析原理 7.icmp協議及報文格式 8.ipv6協議族的其它協議 9.tcp的...
基於流式套接字的訊息收發
今天第一次寫部落格,不知學習python已經將近乙個半月了。經同學的推薦,於是想用部落格來記錄一點東西,也便於自己對於知識的梳理和總結。希望能在這裡結交到興趣相同的盆友,沒事可以交流交流程式設計思想!套接字 實現網路程式設計進行資料傳輸的一種技術手段。所謂流式套接字,是指以位元組流的方式進行資料傳輸...