TCP流式套接字的select模式程式設計

2021-06-15 05:08:34 字數 2849 閱讀 8715

選擇(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已經將近乙個半月了。經同學的推薦,於是想用部落格來記錄一點東西,也便於自己對於知識的梳理和總結。希望能在這裡結交到興趣相同的盆友,沒事可以交流交流程式設計思想!套接字 實現網路程式設計進行資料傳輸的一種技術手段。所謂流式套接字,是指以位元組流的方式進行資料傳輸...