/***************************************************************************
*
desc: 单进程循环服务器
*
座友铭:凡是程序当前不需要的,都是垃圾,80%的时间做20%的事情。(程序的效率)
*
*
***************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BACKLOG 5
#define MAXDATASIZE 1000
#define PORT 1234
void 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
sendbuf[i]=revbuf[num-i-2];
}
sendbuf[num-1]='/0';
send(connectfd,sendbuf,strlen(sendbuf),0);
}
close(connectfd);
}