• poll服务器模型


    #include<stdio.h>
    #include<stdlib.h>
    #include<arpa/inet.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<unistd.h>
    #include<poll.h>
    #include<errno.h>
    #include<string.h>
    
    #define buflen 1024
    #define port 8888
    #define openmax 1024
    #define backlog 10
    int main(int argc,char *argv[]){
    	int listenfd = socket(AF_INET,SOCK_STREAM,0);
    	struct sockaddr_in servaddr;
    	bzero(&servaddr,sizeof(&servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_port = htons(port);
    	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    	int ret = bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
    	ret = listen(listenfd,backlog);
    	struct pollfd client[openmax];
    	int i =0;
    	for(i = 0;i<openmax;i++){
    			client[i].fd = -1;
    	}
    	client[0].fd = listenfd;
    	client[0].events = POLLIN;
    	int maxi = 0;
    	int len ;
    	int nready ;
    	int connfd,sockfd;
    	struct sockaddr_in clientaddr;
    	socklen_t client_len  = sizeof(clientaddr);
    	char buf[buflen];
    	char str[buflen];
    	while(1){
    		nready = poll(client ,maxi+1,-1);
    
    		if(client[0].revents & POLLIN){
    		connfd = accept(listenfd,(struct sockaddr*)&clientaddr,&client_len);
    		printf("received form %s 	 at port %d
    ",inet_ntop(AF_INET,&clientaddr.sin_addr,str,sizeof(str)),ntohs(clientaddr.sin_port));
    		
    
    		for(int i = 1;i<openmax;i++){
    			if(client[i].fd<0){
    				client[i].fd = connfd;
    				break;
    			}
    		}
    
    		client[i].events = POLLIN;
    
    		if(i>maxi){
    			maxi = i;
    		}
    
    		if(--nready <= 0){
    			continue;
    		}
    		}
    		for(i = 1;i<maxi;i++){
    			sockfd = client[i].fd ;
    			if(sockfd<0){
    				continue;
    			}
    			
    			len = read(sockfd,buf,buflen);
    			if(len<=0){
    				printf("CLOSE connection 
    ");
    				close(sockfd);
    				client[i].fd = -1;
    			}
    			else{
    				int k ;
    				for(k = 0;k<len;k++){
    					buf[k] = toupper(buf[k]);
    				}
    				write(sockfd,buf,buflen);
    			}
    			if(--nready <= 0){
    				break;
    			}
    		}
    	}
    	return 0;
    }
    

      服务端

    #include<stdio.h>
    #include<sys/socket.h>
    #include<string.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #include<stdlib.h>
    
    #define port 8888
    #define buflen 1024
    int main(int argc,char* argv[]){
    	int sockfd = socket(AF_INET,SOCK_STREAM,0);
    	int len ;
    	if(sockfd<0){
    		printf("socket failed
    ");
    		exit(1);
    	}
    	char recvbuf[buflen];
    
    	struct sockaddr_in serv_addr;
    	bzero(&serv_addr,sizeof(serv_addr));
    	serv_addr.sin_family = AF_INET;
    	serv_addr.sin_port = htons(port);
    	inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr);
    
    	int ret = connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
    	printf("start to connect...
    ");
    	while(fgets(recvbuf,sizeof(recvbuf),stdin)!=NULL){
    		write(sockfd,recvbuf,strlen(recvbuf));
    		len = read(sockfd,recvbuf,sizeof(recvbuf));
    		write(STDOUT_FILENO,recvbuf,len);
    	}
    	return 0;
    }
    

      客户端

  • 相关阅读:
    [原创]如何在Windows下安装Bugfree2.0.0.1
    [原创]网站性能优化利器之一"google page speed"
    [原创]下一代Web 应用程序安全性测试工具HP WebInspect简介
    [原创]微软软件项目管理Team Foundation Server之测试人员
    [原创]Yeepay网站安全测试漏洞之跨站脚本注入
    [原创]软件测试过程改进的内容和注意事项
    [原创]快钱99bill网站安全性测试漏洞之“跨站式脚本注入”
    马化腾内部讲座:让产品自己召唤人
    [转贴]可用性测试
    [原创]浅谈缺陷分析的意义和方法
  • 原文地址:https://www.cnblogs.com/yjds/p/9080049.html
Copyright © 2020-2023  润新知