linux中select函式的使用例子
/* for sockaddr_in */
#include /* for socket functions */
#include /* for fcntl */
#include /* for select */
#include #include #include #include #include #include #include #define max_line 16384
char rot13_char(char c)
struct fd_state ;
struct fd_state * alloc_fd_state(void)
void free_fd_state(struct fd_state *state)
void make_nonblocking(int fd)
/* * result = 0時,表示連線斷開,return 0;
* resut = -1時,如果errno = eagain,表示阻塞式socket無資料可讀,return 0;
* result = -1時,如果errno != eagain, 表示讀取失敗,return -1.
*/int do_read(int fd, struct fd_state *state) }}
if (result == 0) else if (result < 0)
return 0;}/*
* 將state->write_upto個資料寫入客戶端,如果寫入完畢,置為不可寫狀態.
* 寫入失敗則return -1;成功或傳送緩衝區滿則return 0.
* */
int do_write(int fd, struct fd_state *state)
return -1;
}assert(result != 0);
state->n_written += result;
}/*讀到的資料已經全部寫入客戶端,則重置標誌位*/
if (state->n_written == state->buffer_used)
/*置為不可寫狀態*/
state->writing = 0;
return 0;
}void run(int port)
#endif
if (bind(listen_fd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
if (listen(listen_fd, 16)<0)
fd_zero(&readset);
fd_zero(&writeset);
fd_zero(&exset);
while (1)
fd_set(i, &readset);
/*writing = 1表示該socket還有未傳送的資料,新增對可寫狀態的監聽.*/
if (state[i]->writing) }}
if (select(maxfd + 1, &readset, &writeset, &exset, null) < 0)
/*判斷listen_fd是否有讀事件發生,即是否有新的連線過來.*/
if (fd_isset(listen_fd, &readset)) else if (fd > fd_setsize) else
}/*遍歷0~maxfd描述符*/
for (i = 0; i < maxfd + 1; ++i)
if (fd_isset(i, &readset))
if (r == 0 && fd_isset(i, &writeset))
/*讀取或寫入失敗,則關閉該socket.*/
if (r) }}
}int main(int argc, char **argv)
setvbuf(stdout, null, _ionbf, 0);
run(atoi(argv[1]));
return 0;
}
linux中select函式的使用
linux中select函式的使用 select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這...
linux中select 函式相關
select 的機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,...
Linux 網路程式設計中的 select 函式
我們這裡簡單的說下 select 的作用,並給出 select 的客戶端例項。我們知道 select 是io 多路復用的乙個最簡單支援,poll 和 epoll 是 select 的公升級版。我們通常會遇到這樣乙個問題 當客戶端阻塞在 fgets 等待客戶輸入的時候,伺服器端斷開連線。而客戶端卻不能...