Linux網路程式設計(四) select多路復用

2021-06-01 04:48:47 字數 2192 閱讀 1352

tcp雖然可以實現io非阻塞操作

,但在實際應用時會對資源是否準備完畢進行迴圈測試,增加了不必要的cpu占用。

為了解決這種問題,應用多路復用的知識,select()監聽訊號。相關知識可以參考 linux檔案讀寫 檔案鎖 select poll 。

服務端:

#include #include #include #include #include #include #include #include #include #define port                4321

#define max_que_conn_nm 5

#define max_sock_fd fd_setsize

#define buffer_size 1024

int main()

server_sockaddr.sin_family = af_inet;

server_sockaddr.sin_port = htons(port);

server_sockaddr.sin_addr.s_addr = inaddr_any;

bzero(&(server_sockaddr.sin_zero), 8);

int i = 1;

//設定socket的屬性

setsockopt(sockfd, sol_socket, so_reuseaddr, &i, sizeof(i));

if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr)) == -1)

if(listen(sockfd, max_que_conn_nm) == -1)

printf("listening....\n");

//清空select集合

fd_zero(&inset);

//將要檢測的檔案符加入

fd_set(sockfd, &inset);

while(1)

printf("run for...\n");

for (fd = 0; fd < max_sock_fd; fd++)

fd_set(client_fd, &inset);

printf("new connection from %d(socket)\n", client_fd);

}elseelse

}} /* end of if fd_isset*/

} /* end of for fd*/

} /* end if while while*/

close(sockfd);

exit(0);

}

客戶端:

#include #include #include #include #include #include #include #include #include #define port    4321

#define buffer_size 1024

int main(int argc, char *argv)

if ((host = gethostbyname(argv[1])) == null)

memset(buf, 0, sizeof(buf));

sprintf(buf, "%s", argv[2]);

if ((sockfd = socket(af_inet,sock_stream,0)) == -1)

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(port);

serv_addr.sin_addr = *((struct in_addr *)host->h_addr);

bzero(&(serv_addr.sin_zero), 8);

if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1)

if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)

sleep(30);

close(sockfd);

exit(0);

}

本篇部落格出自 

阿修羅道

linux 網路程式設計 三 非阻塞通訊select

int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 說明 int maxfdp是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1。fd set r...

linux 網路程式設計 三 非阻塞通訊select

int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 說明 int maxfdp是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1。fd set r...

網路程式設計四

5.listen函式 兩個作用 一.客戶端中呼叫listen函式,將未連線的套介面轉換為被動套介面,什麼是未連線套介面 呼叫connect函式外的套介面 實現tcp狀態轉換 close listen 二.指定核心為此套介面排隊的最大連線數 核心維護兩個佇列 未完成佇列,以完成佇列 未完成佇列是為完成...