├── addbranch ├── client ├── client └── client.c ├── poollinux ├── poolserver └── poolserver.c ├── mulitthreadserver ├── multithreadserver └── multithreadserver.c ├── multiprocessserver ├── multiprocessserver └── multiprocessserver.c └── README /addbranch: -------------------------------------------------------------------------------- 1 | 1.第一个版本。 2 | 2.没有采用CGI的相关技术。 -------------------------------------------------------------------------------- /client/client: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tolerious/webserver/HEAD/client/client -------------------------------------------------------------------------------- /poollinux/poolserver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tolerious/webserver/HEAD/poollinux/poolserver -------------------------------------------------------------------------------- /mulitthreadserver/multithreadserver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tolerious/webserver/HEAD/mulitthreadserver/multithreadserver -------------------------------------------------------------------------------- /multiprocessserver/multiprocessserver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tolerious/webserver/HEAD/multiprocessserver/multiprocessserver -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Linux平台下C++开发的网络服务程序设计,多进程网络服务程序,多线程网络服务程 2 | 序,线程池网络服务程序的设计,代码的编写。客户端的主要功能是为用户提供交互 3 | 式的算数运算命令,并通过用户命令完成与服务器端的交互。服务器端采用多进程, 4 | 多线程,线程池三种方式实现,此版本不涉及CGI,后面会给出更新版本。。。 5 | -------------------------------------------------------------------------------- /mulitthreadserver/multithreadserver.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #define SERVER_PORT 5555 20 | 21 | typedef struct mathopt 22 | { 23 | int oprate; 24 | float value1; 25 | float value2; 26 | }mopt; 27 | 28 | void* processthread(void *para) 29 | { 30 | int clientsocket; 31 | char buffer[1024]; 32 | int iDataNum ; 33 | 34 | clientsocket = *((int *)para); 35 | 36 | while(1) 37 | { 38 | iDataNum = recv(clientsocket,buffer,1024,0); 39 | int length = sizeof(struct mathopt); 40 | if(iDataNum < length) 41 | { 42 | perror("error: Recv data !!!"); 43 | break ; 44 | } 45 | struct mathopt *pMp = (struct mathopt *)buffer; 46 | float result = 0; 47 | if(pMp->oprate == 0) 48 | { 49 | result = pMp->value1 + pMp->value2; 50 | } 51 | else if(pMp->oprate == 1) 52 | { 53 | result = pMp->value1 - pMp->value2; 54 | } 55 | else if(pMp->oprate == 2) 56 | { 57 | result = pMp->value1 * pMp->value2; 58 | } 59 | else if(pMp->oprate == 3) 60 | { 61 | result = pMp->value1 / pMp->value2; 62 | } 63 | else if(pMp->oprate == 4) 64 | { 65 | break; 66 | } 67 | char buf[100]; 68 | sprintf(buf,"%f",result); 69 | printf("v1:%f v2:%f o:%d r:%f\n",pMp->value1,pMp->value2,pMp->oprate,result); 70 | int error = send(clientsocket,buf,sizeof(buf),0); 71 | if(error < 0) 72 | break; 73 | } 74 | close(clientsocket); 75 | pthread_exit(NULL); 76 | } 77 | 78 | main() 79 | { 80 | int serverSocket; 81 | struct sockaddr_in server_addr; 82 | struct sockaddr_in clientAddr; 83 | int addr_len = sizeof(clientAddr); 84 | 85 | if((serverSocket = socket(AF_INET,SOCK_STREAM,0)) < 0) 86 | { 87 | perror( "error: create server socket!!!"); 88 | exit(1); 89 | } 90 | 91 | bzero(&server_addr,sizeof(server_addr)); 92 | server_addr.sin_family =AF_INET; 93 | server_addr.sin_port = htons(SERVER_PORT); 94 | server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 95 | if(bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) 96 | { 97 | perror("error: bind address !!!!"); 98 | exit(1); 99 | } 100 | 101 | if(listen(serverSocket,5)<0) 102 | { 103 | perror("error: listen !!!!"); 104 | exit(1); 105 | } 106 | 107 | while(1) 108 | { 109 | int clientsocket; 110 | clientsocket = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len); 111 | if(clientsocket < 0) 112 | { 113 | perror("error: accept client socket !!!"); 114 | continue; 115 | } 116 | 117 | pthread_t threadid; 118 | int temp; 119 | temp = pthread_create(&threadid, NULL, processthread, (void *)&clientsocket); 120 | /*if(threadid !=0) 121 | { 122 | pthread_join(threadid,NULL); 123 | }*/ 124 | } 125 | close(serverSocket); 126 | } 127 | 128 | -------------------------------------------------------------------------------- /multiprocessserver/multiprocessserver.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #define SERVER_PORT 5555 20 | 21 | typedef struct mathopt 22 | { 23 | int oprate; 24 | float value1; 25 | float value2; 26 | }mopt; 27 | 28 | void processchild(int clientsocket) 29 | { 30 | char buffer[1024]; 31 | int iDataNum ; 32 | 33 | while(1) 34 | { 35 | iDataNum = recv(clientsocket,buffer,1024,0); 36 | int length = sizeof(struct mathopt); 37 | if(iDataNum < length) 38 | { 39 | perror("error: Recv data !!!"); 40 | break ; 41 | } 42 | struct mathopt *pMp = (struct mathopt *)buffer; 43 | float result = 0; 44 | if(pMp->oprate == 0) 45 | { 46 | result = pMp->value1 + pMp->value2; 47 | } 48 | else if(pMp->oprate == 1) 49 | { 50 | result = pMp->value1 - pMp->value2; 51 | } 52 | else if(pMp->oprate == 2) 53 | { 54 | result = pMp->value1 * pMp->value2; 55 | } 56 | else if(pMp->oprate == 3) 57 | { 58 | result = pMp->value1 / pMp->value2; 59 | } 60 | else if(pMp->oprate == 4) 61 | { 62 | break; 63 | } 64 | char buf[100]; 65 | sprintf(buf,"%f",result); 66 | printf("v1:%f v2:%f o:%d r:%f\n",pMp->value1,pMp->value2,pMp->oprate,result); 67 | int error = send(clientsocket,buf,sizeof(buf),0); 68 | if(error < 0) 69 | break; 70 | } 71 | close(clientsocket); 72 | } 73 | 74 | main() 75 | { 76 | int serverSocket; 77 | struct sockaddr_in server_addr; 78 | struct sockaddr_in clientAddr; 79 | int addr_len = sizeof(clientAddr); 80 | 81 | if((serverSocket = socket(AF_INET,SOCK_STREAM,0)) < 0) 82 | { 83 | perror( "error: create server socket!!!"); 84 | exit(1); 85 | } 86 | 87 | int optval = SO_REUSEADDR; 88 | setsockopt(serverSocket,SOL_SOCKET,optval,&optval,sizeof(optval)); 89 | bzero(&server_addr,sizeof(server_addr)); 90 | server_addr.sin_family =AF_INET; 91 | server_addr.sin_port = htons(SERVER_PORT); 92 | server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 93 | if(bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) 94 | { 95 | perror("error: bind address !!!!"); 96 | exit(1); 97 | } 98 | 99 | if(listen(serverSocket,5)<0) 100 | { 101 | perror("error: listen !!!!"); 102 | exit(1); 103 | } 104 | 105 | while(1) 106 | { 107 | int clientsocket; 108 | clientsocket = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len); 109 | if(clientsocket < 0) 110 | { 111 | perror("error: accept client socket !!!"); 112 | continue; 113 | } 114 | 115 | int pid = fork(); 116 | if(pid > 0) 117 | { 118 | close(clientsocket); 119 | continue; 120 | } 121 | else if(pid == 0) 122 | { 123 | close(serverSocket); 124 | processchild(clientsocket); 125 | exit(0); 126 | } 127 | else 128 | { 129 | printf("error: fork child process !!!!"); 130 | exit(0); 131 | } 132 | } 133 | close(serverSocket); 134 | } 135 | 136 | -------------------------------------------------------------------------------- /client/client.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #define PORT 5555 15 | #define SERVER_IP "127.0.0.1" 16 | 17 | typedef struct mathopt 18 | { 19 | int oprate; 20 | float value1; 21 | float value2; 22 | }mopt; 23 | 24 | void createopt(struct mathopt *pMp) 25 | { 26 | printf("please input operand one:"); 27 | scanf("%f",&(pMp->value1)); 28 | 29 | printf("please input operand two:"); 30 | scanf("%f",&(pMp->value2)); 31 | } 32 | void help() 33 | { 34 | printf("==================================================================\n"); 35 | printf("版本version 1.0\n"); 36 | printf("作者author:冯赫龙fenghelong\n\n\n"); 37 | printf("%-12s %-12s\n","Command","Fuction"); 38 | printf("%-12s %-12s\n","add","Adder computing"); 39 | printf("%-12s %-12s\n","minus","Minus computing"); 40 | printf("%-12s %-12s\n","multiply","Multiply computing"); 41 | printf("%-12s %-12s\n","divide","Divide computing"); 42 | printf("%-12s %-12s\n","hlep","Print help information"); 43 | printf("%-12s %-12s\n","quit","Exit the program"); 44 | printf("==================================================================\n"); 45 | } 46 | main() 47 | { 48 | 49 | struct sockaddr_in serverAddr; 50 | int clientSocket; 51 | char sendbuf[200]; 52 | char recvbuf[200]; 53 | char command[20]; 54 | if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0) 55 | { 56 | perror( "error: create socket!!!"); 57 | return -1; 58 | } 59 | 60 | serverAddr.sin_family=AF_INET; 61 | serverAddr.sin_port=htons(PORT); 62 | serverAddr.sin_addr.s_addr=inet_addr(SERVER_IP); 63 | 64 | if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0) 65 | { 66 | perror("error: connect remote server !!!"); 67 | exit(1); 68 | } 69 | printf("infor: connect with destination host........[ok]\n"); 70 | printf ("\n"); 71 | printf ("\n"); 72 | printf ("please enter help for more information\n"); 73 | printf ("\n"); 74 | printf ("\n"); 75 | while(1) 76 | { 77 | printf("Input your World:>"); 78 | scanf("%s",command); 79 | struct mathopt mp; 80 | if(strcmp(command,"add") == 0) 81 | { 82 | createopt(&mp); 83 | mp.oprate = 0; 84 | } 85 | else if(strcmp(command,"minus") == 0) 86 | { 87 | createopt(&mp); 88 | mp.oprate = 1; 89 | } 90 | else if(strcmp(command,"multiply") == 0) 91 | { 92 | createopt(&mp); 93 | mp.oprate = 2; 94 | } 95 | else if(strcmp(command,"divide") == 0) 96 | { 97 | while(1) 98 | { 99 | createopt(&mp); 100 | if(mp.value2 == 0) 101 | { 102 | printf("warning: Dividend can not be 0!!!!!\n"); 103 | } 104 | else 105 | { 106 | break; 107 | } 108 | } 109 | mp.oprate = 3; 110 | } 111 | else if(strcmp(command,"help") == 0) 112 | { 113 | help(); 114 | continue ; 115 | } 116 | else if(strcmp(command,"quit") == 0) 117 | { 118 | mp.oprate = 4; 119 | } 120 | else 121 | { 122 | printf("error: can't identify your input !!!\n"); 123 | continue ; 124 | } 125 | 126 | send(clientSocket,(char *)&mp,sizeof(mp),0); 127 | if(mp.oprate == 4) 128 | { 129 | break; 130 | } 131 | recv(clientSocket,recvbuf,200,0); 132 | printf("the result is: %s\n",recvbuf); 133 | } 134 | close(clientSocket); 135 | return 0; 136 | } 137 | -------------------------------------------------------------------------------- /poollinux/poolserver.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #define SERVER_PORT 5555 20 | #define MAX_NUM 4 21 | 22 | typedef struct mathopt 23 | { 24 | int oprate; 25 | float value1; 26 | float value2; 27 | }mopt; 28 | 29 | typedef struct threadatom 30 | { 31 | int clientsocket; //±êŒÇ¿ÉÓÃÌלÓ×Ö 32 | int flag;// ±êŒÇflagÖµ 33 | }tatom; 34 | 35 | struct threadatom threadpoolatom[MAX_NUM]; 36 | pthread_t threadid[MAX_NUM]; 37 | void cleanthreadpool() 38 | { 39 | int i; 40 | for(i = 0; i < MAX_NUM; i++) 41 | { 42 | threadpoolatom[i].clientsocket = 0; 43 | threadpoolatom[i].flag = 0; 44 | threadid[i] = 0; 45 | } 46 | } 47 | void showthreadstatus() 48 | { 49 | int i; 50 | for( i = 0; i < MAX_NUM; i++) 51 | { 52 | if(i % 5 == 0) 53 | { 54 | printf("\n"); 55 | } 56 | printf("[%d] [%d] [%s] |",threadid[i],threadpoolatom[i].clientsocket,threadpoolatom[i].flag>=1?"open":"close"); 57 | } 58 | } 59 | 60 | void* processthread(void *para) 61 | { 62 | int index = *((int *)para); 63 | struct threadatom *pthread = &threadpoolatom[index]; 64 | printf("thread start %d\n",index); 65 | while(1) 66 | { 67 | if(threadpoolatom[index].flag) 68 | { 69 | printf("thread %d\n",index); 70 | char buffer[1024]; 71 | int iDataNum ; 72 | iDataNum = recv(pthread->clientsocket,buffer,1024,0); 73 | int length = sizeof(struct mathopt); 74 | if(iDataNum < length) 75 | { 76 | perror("error: Recv data !!!"); 77 | pthread->clientsocket = 0; 78 | pthread->flag = 0; 79 | continue ; 80 | } 81 | struct mathopt *pMp = (struct mathopt *)buffer; 82 | float result = 0; 83 | if(pMp->oprate == 0) 84 | { 85 | result = pMp->value1 + pMp->value2; 86 | } 87 | else if(pMp->oprate == 1) 88 | { 89 | result = pMp->value1 - pMp->value2; 90 | } 91 | else if(pMp->oprate == 2) 92 | { 93 | result = pMp->value1 * pMp->value2; 94 | } 95 | else if(pMp->oprate == 3) 96 | { 97 | result = pMp->value1 / pMp->value2; 98 | } 99 | else if(pMp->oprate == 4) 100 | { 101 | pthread->clientsocket = 0; 102 | pthread->flag = 0; 103 | continue; 104 | } 105 | 106 | char buf[100]; 107 | sprintf(buf,"%f",result); 108 | printf("v1:%f v2:%f o:%d r:%f\n",pMp->value1,pMp->value2,pMp->oprate,result); 109 | int error = send(pthread->clientsocket,buf,sizeof(buf),0); 110 | if(error < 0) 111 | { 112 | close(pthread->clientsocket); 113 | pthread->clientsocket = 0; 114 | pthread->flag = 0; 115 | continue; 116 | } 117 | } 118 | else 119 | { 120 | printf("sleep thread :%d\n",index); 121 | sleep(1) ; 122 | } 123 | } 124 | } 125 | 126 | main() 127 | { 128 | int serverSocket; 129 | struct sockaddr_in server_addr; 130 | struct sockaddr_in clientAddr; 131 | int addr_len = sizeof(clientAddr); 132 | 133 | if((serverSocket = socket(AF_INET,SOCK_STREAM,0)) < 0) 134 | { 135 | perror( "error: create server socket!!!"); 136 | exit(1); 137 | } 138 | 139 | bzero(&server_addr,sizeof(server_addr)); 140 | server_addr.sin_family =AF_INET; 141 | server_addr.sin_port = htons(SERVER_PORT); 142 | server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 143 | if(bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) 144 | { 145 | perror("error: bind address !!!!"); 146 | exit(1); 147 | } 148 | 149 | if(listen(serverSocket,5)<0) 150 | { 151 | perror("error: listen !!!!"); 152 | exit(1); 153 | } 154 | 155 | cleanthreadpool(); 156 | 157 | int i; 158 | for( i = 0 ; i < MAX_NUM; i++) 159 | { 160 | pthread_t temp; 161 | int err = 0; 162 | printf("i = %d\n",i); 163 | err = pthread_create(&temp, NULL, processthread, (void *)&i); 164 | if(err > 0) 165 | printf("[%d] start ok............\n",i); 166 | sleep(2); 167 | } 168 | 169 | printf("init threadpool status:\n"); 170 | showthreadstatus(); 171 | while(1) 172 | { 173 | int clientsocket; 174 | printf("accetp conn.....\n"); 175 | clientsocket = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len); 176 | if(clientsocket < 0) 177 | { 178 | perror("error: accept client socket !!!"); 179 | continue; 180 | } 181 | printf("find pool.....\n"); 182 | for( i = 0 ; i < MAX_NUM; i++) 183 | { 184 | if(threadpoolatom[i].flag == 0) 185 | { 186 | threadpoolatom[i].flag = 1; 187 | threadpoolatom[i].clientsocket = clientsocket; 188 | break; 189 | } 190 | } 191 | printf("now thread pool status:\n"); 192 | showthreadstatus(); 193 | } 194 | close(serverSocket); 195 | } 196 | 197 | --------------------------------------------------------------------------------