#include #include #include #include #include #include #include #include #include#include#include/* 巨集定義埠號 */
#define portnumber 8000
#define max_line 80
int main(void)
printf("socket!\n");
/*設定套接字選項 使用預設選項*/
setsockopt(lfd, sol_socket, so_reuseaddr, &opt, sizeof(opt));
/* 呼叫bind函式 將serer_addr結構繫結到sockfd上 */
if(bind(lfd,(struct sockaddr *)(&sin),sizeof(struct sockaddr))==-1)
printf("bind!\n");
/* 開始監聽埠 等待客戶的請求 */
if(listen(lfd,20)==-1)
printf("listen!\n");
printf("accepting connections .......\n");
maxfd = lfd; /*對最大檔案描述符進行初始化*/
maxi = -1;
/*初始化客戶端連線描述符集合*/
for(i = 0;i < fd_setsize;i++)
fd_zero(&allset); /* 清空檔案描述符集合 */
fd_set(lfd,&allset); /* 將監聽字設定在集合內 */
/* 開始服務程式的死迴圈 */
while(1)
printf("accepted!\n");
/*查詢乙個空閒位置*/
for(i = 0; imaxfd) /* 新的連線描述符 */
if(i > maxi)
if(--rdy <= 0) /* 減少乙個連線描述符 */
} /* 對每乙個連線描述符做處理 */
for(i = 0;i< fd_setsize;i++)
if(fd_isset(sfd, &rset))
else
} /*如果沒有可以讀的套接字 退出迴圈*/
if(--rdy <= 0)
} }
close(lfd); /* 關閉鏈結套接字 */
return 0;
}
客戶端
#include #include #include #include #include #include #include #include #define portnumber 8000
int main(int argc, charchar *argv)
if((host=gethostbyname(argv[1]))==null)
/* 呼叫socket函式建立乙個tcp協議套介面 */
if((sockfd=socket(af_inet,sock_stream,0))==-1) // af_inet:internet;sock_stream:tcp
bzero(&server_addr,sizeof(server_addr)); //
server_addr.sin_family=af_inet;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);//?
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
while(1)
buffer_2[nbytes]='\0';
printf("client received from server %s\n",buffer_2);
#endif
}
close(sockfd);
exit(0);
}
I O多路轉接
對於多個非阻塞i o,怎麼知道i o何時已經處於可讀或可寫狀態?如果採用迴圈一直呼叫write read,直到返回成功,這樣的方式成為輪詢 polling 大多數時間i o沒有處於就緒狀態,因此這樣的輪詢十分浪費cpu。一種比較好的技術是使用i o多路轉接,也叫做i o多路復用。其基本思想為 先構造...
I O多路轉接(select
一.基本概念 二.函式原型 includeint select int nfds,fd set readfds,fd set writefds,fd set exceptions,struct timeval timeout fd set 介面 void fd clr int fd,fd set s...
select多路IO轉接
void fd zero fd set set 清空乙個檔案描述符集合。fd set rset fd zero rset void fd set int fd,fd set set 將待監聽的檔案描述符,新增到監聽集合中 fd set 3,rset fd set 5,rset fd set 6,rs...