?? 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 + -