zoukankan      html  css  js  c++  java
  • HTTP服务器初步,仅仅实现两端通信

    客户端:

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #define MAXDATASIZE 100 
    int connect_server(int argc, char *argv[])
    {
        int sockfd, numbytes;
        char buf[MAXDATASIZE];
        struct hostent *he;
        struct sockaddr_in their_addr;
        unsigned int myport;
    
        if(argv[2]) myport = atoi(argv[2]);
        else myport = 80;
    
        if (argc != 3) {
            fprintf(stderr,"usage: %s hostname port\n", argv[0]);
            exit(1);
        }
        if((he=gethostbyname(argv[1]))==NULL) {
            herror("gethostbyname");
            exit(1);
        }
        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }
        their_addr.sin_family=PF_INET;
        their_addr.sin_port=htons(myport);
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        bzero(&(their_addr.sin_zero),0);
        if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
            perror("connect");
            exit(1);
        }
        if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
            perror("recv");
            exit(1);
        }
        buf[numbytes] = 0;
        printf("Received: %s\n",buf);
        close(sockfd);
        return 0;
    }
    
    void* thread_process(void* none)
    {
        int argc = 3;
        char* argv[]={"user","192.168.101.99","8080"};
        int i = 0;
        while(i++<1000){
            connect_server(argc,argv);
        }
    }
    
    int main(int argc, char *argv[]){
        int result;
        int i = 0;
        struct timeval tpstart,tpend;
        float timeuse;
        pthread_t pthid[10];
        
        
        gettimeofday(&tpstart,NULL);
        for(i=0;i<10;i++)
            pthread_create(&pthid[i],NULL,thread_process,NULL);
        for(i=0;i<10;i++)
            pthread_join(pthid[i],NULL);
        
        gettimeofday(&tpend,NULL);
        timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
        timeuse/=1000000;
        printf("Used Time:%f\n",timeuse);
        return 0;
    }

    服务器端:

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<string.h>
    #include<errno.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    #include<sys/socket.h>
    #include<sys/wait.h>
    /*************************************
     *file:socketc
     *data time:2013-5.1
     *autho:bluesoybottle
     *
     * ***************************************/
    void* newfd_process(void* argv)
    {
        int new_fd = (*(int*)argv);
         if(send(new_fd,"HTTP 200 OK\n",14,0) == -1){
                     perror("send ok");
             }
             close(new_fd);
    
    }
    
    int main_socket(int arvg_port,int listen_num)
    {
        int sockfd,new_fd;
        struct sockaddr_in local_addr;
        struct sockaddr_in user_addr;
        unsigned int sin_size,local_port,lisnum;
        
        if(arvg_port>0) local_port = arvg_port;
        else local_port = 8080;
    
        if(listen_num > 0 ) lisnum = listen_num;
        else lisnum = 511;
    
        if((sockfd = socket(PF_INET,SOCK_STREAM,0)) == -1){
            perror("socket failed\n");
            return -1;
        }
        
        local_addr.sin_family = PF_INET;
        local_addr.sin_port = htons(local_port);
        local_addr.sin_addr.s_addr = INADDR_ANY;
        bzero(&(local_addr.sin_zero),0);
        
        if(bind(sockfd,(struct sockaddr *)&local_addr,sizeof(struct sockaddr)) == -1){
            perror("bind failed\n");
            return -1;
        }
    
        if(listen(sockfd,lisnum) == -1){
            perror("listen failed\n");
            return -1;
        }
        
        sin_size = sizeof(struct sockaddr_in);
        int total = 0;    
        while(1){
            
            if((new_fd = accept(sockfd,(struct sockaddr*)&user_addr,&sin_size)) == -1 ){
                perror("accpet");
                continue;
            }
            total++;    
            printf("N:%d.server:get connection from%s\n",total,inet_ntoa(user_addr.sin_addr));
            pthread_t thread_id;
            pthread_create(&thread_id,NULL,newfd_process,&new_fd);
            pthread_join(thread_id,NULL);
        }
    }
    
    int main()
    {
        int result = main_socket(8080,-1);
        printf("reulst = %d\n",result);
        return 0;
    }


    十个客户端并发1000连接,时间为2.8s

  • 相关阅读:
    1 外部JavaScript
    1 外部JavaScript
    蓝桥杯:位运算
    Java为什么要配置环境变量
    java数组静态复制和动态复制越界问题
    Dijkstra算法java实现
    离散二元关系实验java实现
    Java中字符串split() 的使用方法
    用java编程实现集合的交、并、差和补运算
    61根据字符出现频率排序(451)
  • 原文地址:https://www.cnblogs.com/gogly/p/3053610.html
Copyright © 2011-2022 走看看