• 并发服务器


    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <time.h>
    #include <errno.h>
    #include <string.h>
    #include <unistd.h>
    
    const int maxline = 4096;
    
    int main(int argc, char **argv) {
    	int listenfd, connfd;
    	socklen_t len;
    	pid_t childpid;
    	struct sockaddr_in servaddr, cliaddr;
    	char buff[maxline], errbuff[maxline];
    	time_t ticks;
    
    	if((listenfd=socket(AF_INET, SOCK_STREAM, 0))<0) {
    		strerror_r(errno, errbuff, maxline);
    		fprintf(stderr, "socket error: %s\n", errbuff);
    		exit(-1);
    	}
    	
    	memset(&servaddr, 0, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    	servaddr.sin_port = htons(9999);
    
    	if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0) {
    		strerror_r(errno, errbuff, maxline);
    		fprintf(stderr, "bind error: %s\n", errbuff);
    		exit(-1);
    	}
    
    	if(listen(listenfd, 1024)<0) {
    		strerror_r(errno, errbuff, maxline);
    		fprintf(stderr, "listen error: %s\n", errbuff);
    		exit(-1);
    	}
    	
    	for(;;)	{
    		len=sizeof(cliaddr);
    		if((connfd=accept(listenfd, (struct sockaddr *)&cliaddr, &len))<0) {
    			strerror_r(errno, errbuff, maxline);
    			fprintf(stderr, "accept error: %s\n", errbuff);
    			exit(-1);
    		}
    		printf("connection from %s, port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), ntohs(cliaddr.sin_port));
    		if((childpid=fork())<0) {
    			strerror_r(errno, errbuff, maxline);
    			fprintf(stderr, "fork error: %s\n", errbuff);
    			exit(-1);
    		} else if(childpid == 0) {
    			printf("ppid: %d\n", getppid());
    			if(close(listenfd)<0) {
    				strerror_r(errno, errbuff, maxline);
    				fprintf(stderr, "child pid close listenfd error: %s\n", errbuff);
    				exit(-1);
    			}
    			ticks = time(NULL);
    			snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
    			if(write(connfd, buff, strlen(buff)) != strlen(buff)) {
    				strerror_r(errno, errbuff, maxline);
    				fprintf(stderr, "write error: %s\n", errbuff);
    				exit(-1);
    			}
    			exit(0);
    		} else {
    			printf("childpid: %d\n", childpid);
    			if(close(connfd)<0) {
    				strerror_r(errno, errbuff, maxline);
    				fprintf(stderr, "parent pid close connfd error: %s\n", errbuff);
    				exit(-1);
    			}
    		}
    	}
    	return 0;
    }	
    

      

  • 相关阅读:
    MYSQL新特性secure_file_priv对读写文件的影响
    weblogic反序列化漏洞CVE-2018-2628-批量检测脚本
    WebLogic WLS-WebServices组件反序列化漏洞—Linux可执行反弹一句话版本
    攻击溯源_一次断网事件的分析
    建立加密socks5转发的两种方法
    【原创】Flash XSS 挖掘
    【转载】SQL的注入类型
    【原创】批处理文本
    【转载】nmap 官方指南
    【转载】对抗 DDoS 攻击的 15 个方法
  • 原文地址:https://www.cnblogs.com/donggongdechen/p/16669397.html
Copyright © 2020-2023  润新知