Linux中select函式的使用舉例

2021-07-15 11:57:31 字數 2045 閱讀 3549

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 等待客戶輸入的時候,伺服器端斷開連線。而客戶端卻不能...