⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parallel_server_select.c

📁 网络编程的服务端和客户端.包括用fork和select分别实现多进程编程和多线程编程.程序已经通过测试的.
💻 C
字号:
#include <sys/socket.h>#include <sys/time.h>#include <netinet/in.h>#include <stdio.h>#include "err_exit.h"#include "socketfun.h"void doit(int client_sockfd);int main(int argc,char ** argv){	int i,maxi,maxfd,listenfd,connfd,sockfd;	int nready,client[FD_SETSIZE];	ssize_t n;	fd_set rset,allset;	char buf[MAXBUFFSIZE];	socklen_t clien;	struct sockaddr_in servaddr,cliaddr;	int rval;	struct timeval to;		/* 创建服务套接字并建立侦听队列 */	listenfd=socket_listen(NULL,STRPARALLELPORT);		/* 初始化描述字集合、最大描述字个数、客户数组client以及其索引maxi */	FD_ZERO(&allset);	FD_SET(listenfd,&allset);	maxfd=listenfd;	for(i=0;i<FD_SETSIZE;i++)		client[i]=-1;			/* -1表示该登记项没有记录 */	maxi=-1;		/* 等待客户 */	while(1){		rset=allset;		/* 等待到达新的连接或者新的输入 */		printf("server waiting\n");		nready=select(maxfd+1,&rset,NULL,NULL,NULL);		/* 判别就绪的是连接还是输入 */		if(FD_ISSET(listenfd,&rset)){	/* 如果就绪的是listenfd,意味着到达了新的连接 */			/* 接收连接 */			clien=sizeof(cliaddr);			connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clien);						/* 加入这个新客户至客户数组 */			for(i=0;i<FD_SETSIZE;i++){				if(client[i]<0){					client[i]=connfd;					break;				}			}			if(i==FD_SETSIZE){				printf("too many clients \n");				exit(1);			}						/* 加入这个新连接的套接字至描述字集合 */			FD_SET(connfd,&allset);			printf("adding client on fd %d \n",connfd);			if(connfd>maxfd)				maxfd=connfd; 	/* 记录最大连接数,用于select */			if(i>maxi)				maxi=i;			/* 记录当前最大客户数 */			if(--nready<=0)		/* 若无可读的套接字,回去等待下一个就绪套接字 */				continue;		}		/* 就绪集合中有可读套接字,逐一处理其中的每一个 */		for(i=0;i<=maxi;i++){			if((sockfd=client[i])<0)	/* 无效记录 */				continue;			if(FD_ISSET(sockfd,&rset)){	/* 如果是读就绪套接字 */				/* 读该套接字。若遇到文件尾,关闭它并从就绪集合中清除 */				if((n=read(sockfd,buf,MAXBUFFSIZE))==0){					close(sockfd);					FD_CLR(sockfd,&allset);					client[i]=-1;				}else{	/* 否则,处理请求并回答客户 */					sleep(5);					buf[n]=0;					printf("serving client on fd %d \n",sockfd);					printf("serving client on fd %s \n",buf);					write(sockfd,buf,n);				}				if(--nready<=0)	/* 已无可读套接字 */					break;			}			}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -