网络通讯中服务器端编程实例(一 单进程循环)

 
/***************************************************************************
*     author: denny [email protected] 2006  
*     desc: 单进程循环服务器
*     座友铭:凡是程序当前不需要的,都是垃圾,80%的时间做20%的事情。(程序的效率)
*                                                                          *
***************************************************************************/
#include 
#include 
#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);
}
 

你可能感兴趣的:(网络通讯编程)