zoukankan      html  css  js  c++  java
  • c 客户端并发传输xml给服务器端解析2

    ///////////////////////////////////////////////////////////////////////////////////
    //multi_thread_server.c
    ///////////////////////////////////////////////////////////////////////////////////
    //本文件是多线程并发服务器的代码
    #include <netinet/in.h>    // for sockaddr_in
    #include <sys/types.h>    // for socket
    #include <sys/socket.h>    // for socket
    #include <stdio.h>        // for printf
    #include <stdlib.h>        // for exit
    #include <string.h>        // for bzero
    #include <pthread.h>       
    #include <sys/errno.h>    // for errno
    #include <unistd.h> //define close

    #include <string.h>  
    #include <libxml/parser.h>
    #include <libxml/tree.h>

    #define HELLO_WORLD_SERVER_PORT    6666
    #define LENGTH_OF_LISTEN_QUEUE 20
    #define BUFFER_SIZE 1024
    #define THREAD_MAX    5

    void * getxml(char *argv);
    void * talk_to_client(void *data)
    {                  
        //void* 数据可以转换为任意类型数据

    FILE *fp;

        int new_server_socket = (int)data;
    int length=0;
        char buffer[BUFFER_SIZE];
        bzero(buffer, BUFFER_SIZE);
    char bf[]="";
        strcpy(buffer,"hi.从服务器来");
        strcat(buffer,"\n"); //C语言字符串连接
        //发送buffer中的字符串到new_server_socket,实际是给客户端
        send(new_server_socket,buffer,BUFFER_SIZE,0);
        bzero(buffer,BUFFER_SIZE);
        //接收客户端发送来的信息到buffer中
        if(( length = recv(new_server_socket,buffer,BUFFER_SIZE,0)) < 0)
        {
            printf("Server Recieve Data Failed!\n");
            exit(1);
        }
        printf("\nSocket Num: %d \t %s",new_server_socket, buffer);

    //fp = fopen("a.xml", "w");//打开文件
    //fwrite(buffer,sizeof(char),strlen(buffer),fp);//写文件
    //fclose(fp);//关闭

       getxml(buffer);

       //send(new_server_socket,buffer,BUFFER_SIZE,0);
        //关闭与客户端的连接
        close(new_server_socket);
        pthread_exit(NULL);
    }
    void * getxml(char *argv)
    {                  
                         xmlDocPtr doc=NULL;
                         xmlNodePtr cur=NULL;
                         char* name=NULL;
                         char* value=NULL;

                        xmlKeepBlanksDefault (0);

                        //if(argc<2)
                       // {
            // printf("argc must be 2 or above\n");
                                // return -1;
                       // }
                       // doc=xmlParseFile(argv);//创建Dom树
          doc=xmlRecoverDoc(argv);//创建Dom树
                        if(doc==NULL)
                       {
                               
            printf("Loading xml file failed!\n");
                                 exit(1);
                         }

                       cur=xmlDocGetRootElement(doc);//获取根节点
                       if(cur==NULL)
                       {
                             
              printf("empty file!\n");
                                 xmlFreeDoc(doc);
                                 exit(2);
                        }
                       //walk the tree
                       cur=cur->xmlChildrenNode;//get sub node
           int a=0;
                       while(cur !=NULL)
                      {
                                   name=(char*)(cur->name);
                                   value=(char*)xmlNodeGetContent(cur);
                                 // cout<<"name is: "<<name<<", value is: "<<value<<endl;
              printf("\nvalue is: %d \t %s",name, value);
              a+=atoi(value);
                                   xmlFree(value);
                                  cur=cur->next;

                       }
                       printf("\nresult is: %d \t ",a);
                       xmlFreeDoc(doc);//释放xml解析库所用资源
                       xmlCleanupParser();
    }

    int main(int argc, char **argv)
    {
    int server_socket=0;
        int new_server_socket=0;
        //设置一个socket地址结构server_addr,代表服务器internet地址, 端口
        struct sockaddr_in server_addr;
        bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
        server_addr.sin_family = AF_INET;
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
        //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
    server_socket = socket(AF_INET,SOCK_STREAM,0);
        if (server_socket==-1)
        {
            printf("Create Socket Failed!");
            exit(1);
        }
        //把socket和socket地址结构联系起来
        if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
        {
            printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
            exit(1);
        }
        //server_socket用于监听
        if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
        {
            printf("Server Listen Failed!");
            exit(1);
        }
        int i=0;
        while(1) //服务器端要一直运行
        {
            //定义客户端的socket地址结构client_addr
            struct sockaddr_in client_addr;
            socklen_t length = sizeof(client_addr);
            //接受一个到server_socket代表的socket的一个连接
            //如果没有连接请求,就等待到有连接请求--这是accept函数的特性
            //accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
            //new_server_socket代表了服务器和客户端之间的一个通信通道
            //accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
           
       if (( new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length))== -1)
            {
                printf("Server Accept Failed!\n");
                break;
            }
            pthread_t child_thread;
            pthread_attr_t child_thread_attr;
            pthread_attr_init(&child_thread_attr);
            pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);
            if( pthread_create(&child_thread,&child_thread_attr,talk_to_client, (void *)new_server_socket)<0)
       {
                printf("pthread_create Failed : %s\n",strerror(errno));
       }
       //getxml();
      
        }
        //关闭监听用的socket
        close(server_socket);
        return 0;


    }

  • 相关阅读:
    django-templates 模板变量
    实用代码
    游戏渠道后台上线
    游戏投放中的-LTV概念与价值
    转字符串格式format技巧
    mysql -数据库设计三范式
    OAuth2.0基本原理及应用
    回调函数
    GitHub 博客园快捷发布工具
    前端react antd加载错误解决
  • 原文地址:https://www.cnblogs.com/zzxap/p/2175809.html
Copyright © 2011-2022 走看看