1樓:
#include
#include
#define port 5150 //埠
#define msgsize 1024 //資訊大小
#pragma ***ment(lib, "ws2_32.lib")
int g_itotalconn = 0; //連線數量
socket g_clisocketarr[fd_setsize]; //套接字陣列
dword winapi workerthread(lpvoid lpparameter);//執行緒函式
int main()
return 0;
}dword winapi workerthread(lpvoid lpparam)//執行緒
;//超時時間 select模型中用到的這裡是1秒
char szmessage[msgsize];//資訊陣列,事實上就是個緩衝區
while (true)
//**************************************
// we only care read event
//只關心讀的情況
if (ret == 0)
//如果select返回不是0
for (i = 0; i < g_itotalconn; i++)
}else}}
}return 0;}
網路程式設計的select()函式工作原理
2樓:天蠍神經俠侶
1. select系統呼叫
select系統呼叫是用來讓我們的程式監視多個檔案描述符的狀態變化的。程式會停在select這裡等待,直到被監視的檔案描述符有某一個或多個發生了狀態改變。
select()的機制中提供一fd_set的資料結構,實際上是一long型別的陣列,每一個陣列元素都能與一開啟的檔案控制代碼建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select()時,由核心根據io狀態修改fd_set的內容,由此來通知執行了select()的程序哪些socket或檔案可讀可寫。
select函式原型:
#include #include #include #include int select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);
ndfs:select監視的檔案控制代碼數,視程序中開啟的檔案數而定,一般設為要監視各檔案中的最大檔案描述符值加1。
readfds:這個檔案描述符集合監視檔案集中的任何檔案是否有資料可讀,當select函式返回的時候,readfds將清除其中不可讀的檔案描述符,只留下可讀的檔案描述符。
writefds:這個檔案描述符集合監視檔案集中的任何檔案是否有資料可寫,當select函式返回的時候,writefds將清除其中不可寫的檔案描述符,只留下可寫的檔案描述符。
exceptfds:這個檔案集將監視檔案集中的任何檔案是否發生錯誤,其實,它可用於其他的用途,例如,監視帶外資料oob,帶外資料使用msg_oob標誌傳送到套接字上。當select函式返回的時候,exceptfds將清除其中的其他檔案描述符,只留下標記有oob資料的檔案描述符。
timeout:本次select()的超時結束時間。這個引數至關重要,它可以使select處於三種狀態:
(1)若將null以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;
(2)若將時間值設為0秒0毫秒,就變成一個純粹的非阻塞函式,不管檔案描述符是否有變化,都立刻返回繼續執行,檔案無變化返回0,有變化返回一個正值;
(3)timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。
函式的返回值:
正值:表示監視的檔案集中有檔案描述符符合要求
零值:表示select監視超時
負值:表示發生了錯誤,錯誤值由errno指定。
巨集操作:
fd_zero(fd_set *set): 用來清除描述片語set的全部位
fd_set(int fd,fd_set*set): 用來設定描述片語set中相關fd的位
fd_isset(int fd,fd_set *set): 用來測試描述片語set中相關fd 的位是否為真
fd_clr(inr fd,fd_set* set): 用來清除描述片語set中相關fd 的位注意事項:
(1)對於可寫性的檢查,最好放在需要寫資料的時候進行檢查。如果和可讀性放在同一個地方進行檢查,那麼select很可能每次都會因為可寫性檢查成功而返回。
(2)select()呼叫會清空傳遞給它的集合引數中的內容,也就是會清空readfds、writefd、exceptfds這三個指標引數所指定的描述符集合。因此,在每次呼叫select()之前,必須重新初始化並把需要監視的描述符填寫到相應的描述符集合中。select()呼叫也會清空timeout指標所指向的struct timeval結構,所以在每次呼叫select()之前也要重新填充timeout指標所指向的struct timeval結構。
socket網路程式設計中前幾章說listenfd是listen函式的返回值,後面的tcp伺服器模型上又是socket()的返回值
3樓:匿名使用者
這樣理解:
socket()的返copy回值是伺服器本bai地監聽用的fd,通過這個fd,可du以判斷是否有客戶端連線zhi
上來,那dao些客戶端連線上來,但是不能用這個fd用來和客戶端通訊。
listenfd是指客戶端連線本機時的fd,是用來和客戶端通訊用的。
程式設計裡所說的函式是什麼意思,在程式設計中,函式是什麼意思
function,譯為方法或函式來.函式中的代原始碼執行後可以實現你bai某種目的,或者得到想du要的資料zhi.首先要記得函式的定義格式dao 1.無返回值的定義 void函式名 形參1,形參2.2.有返回值的定義 返回型別 比如int,float,使用者自定義型別 函式名 形參1,形參2.在就是...
請問,在C windows程式設計中的函式onDraw CDC pDC 裡,pDC怎麼進行初始化呢
1 這個pdc不用初始化的哦,系統已經幫你初始化,你直接呼叫就可以了。2 ondraw函式使用paintdc,該函式裡面不能使用自己建立的cdc物件 ondraw cdc pdc 裡的 pdc怎麼來的 表示這是一個指標,指標變數通常用p開始,用法是 pdc vs2010中定義的函式ondraw cd...
android程式設計中如何設定頁面關閉之後再開啟顯示是關閉
關於資料儲存的問題。方法有好多種,比如資料庫什麼的,還有就是preferences。你可以參考下這個帖子。在oncreate 括號內的引數就是用來儲存資料的 我覺得你應該要將第一次的頁面在關閉之前儲存起來吧。然後開啟之後,再讀取儲存的資料就行了吧。要不然沒辦法啊。你不finish掉不就行了!fire...