多进程服务器端:
/* * ===================================================================================== * * Filename: MulProcServer.c * * Description: * * Version: 1.0 * Created: 2012年02月21日 00时49分26秒 * Revision: none * Compiler: gcc * * Author: MaZheng (blog.youkuaiyun.com/mazheng1989), mazheng19891019@gmail.com * Company: Dalian University Of Technology * * ===================================================================================== */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 1234 /* */ #define BACKLOG 5 /* */ #define MAXDATASIZE 1000 /* */ void process_cli(int connfd,struct sockaddr_in client); int main() { int listenfd,connfd; pid_t pid; struct sockaddr_in server; struct sockaddr_in client; if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("Createing socket failed."); exit(1); } int opt=SO_REUSEADDR; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))==-1) { perror("Bind() error."); exit(1); } if(listen(listenfd,BACKLOG)==-1) { perror("listen() error.\n"); exit(1); } socklen_t len=sizeof(client); while(1) { if((connfd=accept(listenfd,(struct sockaddr *)&client,&len))==-1) { perror("accept() error.\n"); exit(1); } if((pid=fork())>0) { close(connfd); continue; } else if(pid==0) { close(listenfd); process_cli(connfd,client); exit(0); } else { printf("fork() error.\n"); exit(0); } } close(listenfd); return 0; } void process_cli(int connfd,struct sockaddr_in client) { int num; char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],cli_name[MAXDATASIZE]; printf("You got a connection from %s.",inet_ntoa(client.sin_addr)); num=recv(connfd,cli_name,MAXDATASIZE,0); if(num==0) { close(connfd); printf("client disconnected.\n"); return ; } cli_name[num-1]='\0'; printf("client's name is %s.\n",cli_name); while((num=recv(connfd,recvbuf,MAXDATASIZE,0))!=-1) { recvbuf[num]='\0'; printf("received client ( %s )message: %s",cli_name,recvbuf); if(strcmp(recvbuf,"bye\n")==0) break; int i=0; for(i=0;i<num-1;i++) { if((recvbuf[i]>='a'&&recvbuf[i]<='z')||(recvbuf[i]>='A'&&recvbuf[i]<='Z')) { recvbuf[i]=recvbuf[i]+3; if((recvbuf[i]>'Z'&&recvbuf[i]<='Z'+3)||recvbuf[i]>'z') { recvbuf[i]=recvbuf[i]-26; } } sendbuf[i]=recvbuf[i]; } sendbuf[num-1]='\0'; send(connfd,sendbuf,strlen(sendbuf),0); } close(connfd); }运行命令:$:gcc MulProcServer.c -o MulProcServer.out
$:./MulProcServer.out
多进程客户端:
/* * ===================================================================================== * * Filename: MulProcClient.c * * Description: * * Version: 1.0 * Created: 2012年02月21日 02时28分00秒 * Revision: none * Compiler: gcc * * Author: MaZheng (blog.youkuaiyun.com/mazheng1989), mazheng19891019@gmail.com * Company: Dalian University Of Technology * * ===================================================================================== */ #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define PORT 1234 /* */ #define MAXDATASIZE 100 /* */ void process(FILE *fp,int sockfd); char *getMessage(char *sendline,int len,FILE* fp); int main(int argc,char **argv) { int sockfd; struct hostent *he; struct sockaddr_in server; if(argc!=2) { printf("Usage: %s <IP Address>\n",argv[0]); exit(1); } if((he=gethostbyname(argv[1]))==NULL) { printf("gethostbyname() error.\n"); exit(1); } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { printf("socket() error.\n"); exit(1); } bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr=*((struct in_addr *)he->h_addr); if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))==-1) { printf("connect() error.\n"); exit(1); } process(stdin,sockfd); close(sockfd); return 0; } void process(FILE *fp,int sockfd) { char sendline[MAXDATASIZE],recvline[MAXDATASIZE]; int num; printf("connected to server.\n"); printf("Input client's name:"); if(fgets(sendline,MAXDATASIZE,fp)==NULL) { printf("\n Exit.\n"); return; } send(sockfd,sendline,strlen(sendline),0); while(getMessage(sendline,MAXDATASIZE,fp)!=NULL) { send(sockfd,sendline,strlen(sendline),0); if(strcmp(sendline,"bye")==0) break; if((num=recv(sockfd,recvline,MAXDATASIZE,0))==0) { printf("server terminated.\n"); return; } recvline[num]='\0'; printf("server Message : %s\n",recvline); } printf("\n Exit.\n"); } char *getMessage(char *sendline,int len,FILE *fp) { printf("Input string to server:"); return (fgets(sendline,MAXDATASIZE,fp)); }运行命令:$:gcc MulProcClient.c -o MulProcClient.out
$:./MulProcClient.out 127.0.0.1
多线程服务器端:
/* * ===================================================================================== * * Filename: MulThreadServer.c * * Description: * * Version: 1.0 * Created: 2012年02月21日 15时01分48秒 * Revision: none * Compiler: gcc * * Author: MaZheng (blog.youkuaiyun.com/mazheng1989), mazheng19891019@gmail.com * Company: Dalian University Of Technology * * ===================================================================================== */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <pthread.h> #define PORT 1234 /* */ #define BACKLOG 5 /* */ #define MAXDATASIZE 1000 /* */ void process_cli(int connfd,struct sockaddr_in client); void *function(void *arg); struct ARG{ int connfd; struct sockaddr_in client; }; int main() { int listenfd,connfd; pthread_t tid; struct ARG *arg; struct sockaddr_in server; struct sockaddr_in client; socklen_t len; if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("creating socket failed."); exit(1); } int opt=SO_REUSEADDR; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))==-1) { perror("bind() error.\n"); exit(1); } if(listen(listenfd,BACKLOG)==-1) { perror("listen() error.\n"); exit(1); } len=sizeof(client); while(1) { if((connfd=accept(listenfd,(struct sockaddr *)&client,&len))==-1) { perror("accept() error.\n"); exit(1); } arg=(struct ARG *)malloc(sizeof(struct ARG)); arg->connfd=connfd; memcpy((void *)&arg->client,&client,sizeof(client)); if(pthread_create(&tid,NULL,function,(void *)arg)) { perror("pthread_create() error.\n"); exit(1); } } close(listenfd); return 0; } void *function(void *arg) { struct ARG *info; info=(struct ARG *)arg; process_cli(info->connfd,info->client); free(arg); pthread_exit(NULL); } void process_cli(int connfd,struct sockaddr_in client) { int num; char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],cli_name[MAXDATASIZE]; printf("Yoy got a connection from %s.\n",inet_ntoa(client.sin_addr)); num=recv(connfd,cli_name,MAXDATASIZE,0); if(num==0) { close(connfd); printf("client disconnected.\n"); return; } cli_name[num-1]='\0'; printf("client's name is %s.\n",cli_name); while(num=recv(connfd,recvbuf,MAXDATASIZE,0)) { recvbuf[num]='\0'; printf("received client ( %s ) message:%s",cli_name,recvbuf); int i; for(i=0;i<num-1;i++) { if((recvbuf[i]>='a'&&recvbuf[i]<='z')||(recvbuf[i]>='A'&&recvbuf[i]>='Z')) { recvbuf[i]=recvbuf[i]+3; if((recvbuf[i]>'Z'&&recvbuf[i]<='Z'+3)||(recvbuf[i]>'z')) { recvbuf[i]=recvbuf[i]-26; } } sendbuf[i]=recvbuf[i]-26; } sendbuf[num-1]='\0'; send(connfd,sendbuf,strlen(sendbuf),0); } close(connfd); }运行命令: $:gcc -pthread MulThreadServer.c -o MulTreadServer.out (要加上-pthread选项才能编译多线程程序
$:./MulTreadServer.out 127.0.0.1