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 二.指定核心為此套介面排隊的最大連線數 核心維護兩個佇列 未完成佇列,以完成佇列 未完成佇列是為完成...