简单的并发服务器

来源:互联网 发布:淘宝娃娃海报图片素材 编辑:程序博客网 时间:2024/05/22 04:57

服务器端代码:

#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <unistd.h>#include <stdio.h>#include <arpa/inet.h>#include <string.h>#include <stdlib.h>int main(int argc, char *argv[]){int listenfd,connfd;pid_t childpid;socklen_t clilen;struct sockaddr_in cliaddr,servaddr;listenfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == listenfd){printf("Create socket failed.\n");return -1;}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(45678);int res = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));if(0 != res){printf("Bind failed.\n");return -1;}res = listen(listenfd, 5);if(0 != res){printf("Listen failed.\n");}for(; ;){clilen = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);if(-1 == connfd){printf("Accept failed.\n");return -1;}childpid = fork();if(0 > childpid){printf("Fork error.\n");return -1;}if(0 == childpid){close(listenfd);str_echo(connfd);close(connfd);exit(0);}else{close(connfd);}}close(listenfd);return 0;}

服务器端显示函数:

#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#define  MAXLINE 2048void str_echo(int sockfd){char buf[MAXLINE];ssize_t n;printf("This is server %d.\n",getpid());n= read(sockfd, buf, MAXLINE);printf("%s\n",buf);n =write(sockfd, buf, strlen(buf));}

客户端代码:

#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <stdio.h>#include <netinet/in.h>#include <string.h>#include <unistd.h>int main(int argc, char * argv[]){int sockfd, res;struct sockaddr_in servaddr;if(2 != argc){printf("usage: %s.\n",argv[0]);return -1;}sockfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sockfd){printf("Create socket failed.\n");return -1;}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(45678);res = inet_pton(AF_INET, argv[1], &servaddr.sin_addr);if(1 != res){printf("Inet_pton error.\n");return -1;}res = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));if(0 != res){printf("Connect error.\n");return -1;}str_cli(stdin, sockfd);close(sockfd);return 0;}

客户端显示函数:

#include <unistd.h>#include <stdio.h>#include <string.h>#define MAXLINE 2048void str_cli(FILE *fp, int sockfd){char send[MAXLINE], recive[MAXLINE];while(fgets(send, MAXLINE, fp) != NULL) {size_t n = write(sockfd, send, strlen(send));read(sockfd, recive, MAXLINE);fputs(recive, stdout);}}
测试结果:

服务器

abel@abel-ubuntu:~/Socket$ ./server2&[1] 5270abel@abel-ubuntu:~/Socket$ This is server 5396.zhouThis is server 5398.lee

客户1 和客户2

abel@abel-ubuntu:~/Socket$ ./client2 127.0.0.1leelee

abel@abel-ubuntu:~/Socket$ ./client2 127.0.0.1zhouzhou

总结:

并发服务器能够同时处理多个客户请求,适用于客户请求时间较长,客户较多的场合。并发服务器的典型模型是,在客户请求到来,服务器端accept函数返回之后。服务器fork出一个子进程来服务客户请求。父进程继续监听。

原创粉丝点击