#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <pthread.h>
void InitServerAddr(struct sockaddr_in* addr){
bzero(addr,sizeof(struct sockaddr_in));
addr->sin_addr.s_addr = inet_addr("127.0.0.1");
addr->sin_family = AF_INET;
addr->sin_port = htons(8888);
addr->sin_len = sizeof(struct sockaddr_in);
}
#define prr_exit(x) do{perror(x);return -1;}while(0);
int main(void){
int server_sockfd,client_sockfd;
struct sockaddr_in server_addr;
(void)InitServerAddr(&server_addr);
if ((server_sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
prr_exit("[create socket]");
if (bind(server_sockfd,(struct sockaddr*)&server_addr,server_addr.sin_len) < 0)
prr_exit("[bind]");
listen(server_sockfd,20);
fd_set readset,allset;
FD_ZERO(&allset);
FD_SET(server_sockfd,&allset);
int fd_array[FD_SETSIZE],nready,nread;
for (int i = 0; i < FD_SETSIZE; i++)
fd_array[i] = -1;
char buf[30];
while(1){
readset = allset;
printf ("server waitting ready fd.\n");
nready = select(FD_SETSIZE,&readset,NULL,NULL,NULL);
if (nready < 0)
prr_exit("[select]");
if (FD_ISSET(server_sockfd,&readset)){
client_sockfd = accept(server_sockfd,NULL,NULL);
if (client_sockfd < 0)
prr_exit("[accept]");
FD_SET(client_sockfd,&allset);
for (int i = 0; i < FD_SETSIZE; i++)
if (fd_array[i] < 0){
fd_array[i] = client_sockfd;
break;
}
if (--nready == 0){//表示监听的一个套接字已经处理完成
continue;
}
}
for (int i = 0; i < FD_SETSIZE; i++){
if (fd_array[i] < 0)//检测到有客户端在进行处理
continue;
if (FD_ISSET(fd_array[i],&readset)){
bzero(buf,30);
nread = read(fd_array[i],buf,30);
if (nread == 0){
close(fd_array[i]);
FD_CLR(fd_array[i],&allset);
fd_array[i] = -1;
}else if (nread > 0){
printf ("recv = %s\n",buf);
}
if (--nready == 0){
break;
}
}
}
}
return 0;
}
select模型2
最新推荐文章于 2022-08-23 11:32:42 发布