首页 > 代码库 > linux编程实例--简单多进程服务器
linux编程实例--简单多进程服务器
主要利用fork事先创建若干个进程,并发处理多个客户端的连接,返回当前系统时间。具体代码如下:
server.c
# include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> # include <time.h> # include <string.h> # include <stdio.h> # include <signal.h> # include <errno.h> # include <unistd.h> #define BUFFLEN 1024 #define SERVER_PORT 3333 #define BACKLOG 5 #define PIDNUM 3 static void handle_connect(int serv_fd) { int client_fd; struct sockaddr_in client_addr; int len=sizeof(client_addr); while(1) { if((client_fd=accept(serv_fd,(struct sockaddr*)&client_addr,&len))<0) { perror("accept"); exit(errno); } printf("accept Done,the process id=%d\n",getpid()); time_t now; char buff[BUFFLEN]={0}; int n=0; memset(buff,0,BUFFLEN); n=recv(client_fd,buff,BUFFLEN,0); if(n>0&&!strncmp(buff,"TIME",4)) { memset(buff,0,BUFFLEN); now=time(NULL); sprintf(buff,"%24s\r\n",ctime(&now)); send(client_fd,buff,strlen(buff),0); } close(client_fd); } } void sig_int(int num) { exit(1); } int main(int argc, char* argv[]) { int servfd; unsigned int lisnum=3; struct sockaddr_in serv_addr; signal(SIGINT,sig_int); servfd=socket(AF_INET,SOCK_STREAM,0); memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(SERVER_PORT); int err=bind(servfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); if(listen(servfd,lisnum) == -1){ perror("listen"); exit(errno); }else printf("the server is listening!\n"); pid_t pid[PIDNUM]; int i=0; for(i=0;i<PIDNUM;i++) { pid[i]=fork(); if(pid[i]==0) { handle_connect(servfd); } } while(1); close(servfd); return 0; }
client.c
#include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<time.h> #include<string.h> #include<stdio.h> #include<errno.h> #define BUFFLEN 1024 #define SERVER_PORT 3333 int main(int argc,char*argv[]) { int clientfd; struct sockaddr_in serv_addr; time_t now; char buff[BUFFLEN]={0}; int n=0,err; clientfd=socket(AF_INET,SOCK_STREAM,0); memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(SERVER_PORT); if((err=connect(clientfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)))<0) { perror("connect"); exit(errno); } printf("Connected Done!!\n"); memset(buff,0,BUFFLEN); strcpy(buff,"TIME"); send(clientfd,buff,strlen(buff),0); memset(buff,0,BUFFLEN); n=recv(clientfd,buff,BUFFLEN,0); if(n>0) { printf("TIME:%s\n",buff); } close(clientfd); return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。