c 用戶端並發傳輸xml給伺服器端解析2

來源:互聯網
上載者:User

///////////////////////////////////////////////////////////////////////////////////
//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;

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.