📄 server.c
字号:
/**************************************************************************** Copyright (C) 2006 by Soasen Co.,Ltd. ** desc: 单进程循环服务器* 座友铭:凡是程序当前不需要的,都是垃圾,80%的时间做20%的事情。(程序的效率)* ****************************************************************************/#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <pthread.h>#include <malloc.h>#include <stdlib.h>#define BACKLOG 5#define MAXDATASIZE 1000#define PORT 1234void process_cli(int,sockaddr_in);int main(int argc,char *argv[]) //需要一个参数 端口号{ int listenfd, //监听套接字sock connectfd; //accept 收到的 新套接字 struct sockaddr_in servAddr, //服务器地址 cliAddr; //客户端地址 socklen_t adrlen; //sockaddr地址长度 int servPort; //服务器监听端口号 //获得服务器监听的端口号 if(argc!=2) { printf("Usage:%s portnumber\a\n",argv[0]); return 1; } if((servPort=atoi(argv[1]))<0) { printf("Usage:%s portnumber\a\n",argv[0]); return 1; } /* 服务器端开始建立socket描述符 */ if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); return 1; } /*设置套接字地址结构体servAddr中的参数,绑定服务器端口号*/ servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=htonl(INADDR_ANY); servAddr.sin_port=htons(servPort); if(bind(listenfd,(struct sockaddr *)&servAddr,sizeof(servAddr))<0) { printf("Bind error:%s\n\a",strerror(errno)); exit(2); } /* 监听sockfd描述符 */ if(listen(listenfd,BACKLOG)==-1) { printf("Listen error:%s\n\a",strerror(errno)); exit(3); } while(1) { printf("%s:waiting for data on port TCP %u\n",argv[0],servPort); adrlen=sizeof(struct sockaddr_in); connectfd=accept(listenfd,(struct sockaddr *)&cliAddr,&adrlen); if(connectfd<0) { perror("accetp() error\n"); exit(4); } process_cli(connectfd,cliAddr); }}void process_cli(int connectfd, sockaddr_in client){ int num; char sendbuf[MAXDATASIZE],revbuf[MAXDATASIZE]; printf("You get a connetion from %s\n",inet_ntoa(client.sin_addr)); while((num=recv(connectfd,revbuf,MAXDATASIZE,0))){ revbuf[num]='\0'; printf("Receive client message: %s", revbuf); for(int i=0;i<num-1;i++){ sendbuf[i]=revbuf[num-i-2]; } sendbuf[num-1]='\0'; send(connectfd,sendbuf,strlen(sendbuf),0); } close(connectfd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -