• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            興海北路

            ---男兒仗劍自橫行
            <2011年4月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            統計

            • 隨筆 - 85
            • 文章 - 0
            • 評論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類

            隨筆檔案

            收藏夾

            全是知識啊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            入門多線程服務器程序實例

            fedora core 5
            g++

            服務器端程序:

            #include <stdlib.h>

            #include 
            <sys/types.h>

            #include 
            <sys/socket.h>

            #include 
            <netinet/in.h>

            #include 
            <unistd.h>

            #include 
            <pthread.h>

            #include 
            <stdio.h>

            #include 
            <string.h>

            #include 
            <arpa/inet.h>



            #define PORT 8848

            #define BACKLOG 5

            #define MAXDATASIZE 1000



            void process_cli(int connectfd, sockaddr_in client);



            void* start_routine(void* arg);

            struct ARG {

                   
            int connfd;

                   sockaddr_in client;

                   };

                   

            main()

            {

                  
            int listenfd, connectfd;

                  pthread_t thread;         
            //id of thread

                  ARG 
            *arg;

                  
            struct sockaddr_in server; //server's address info

                  
            struct sockaddr_in client; //client's

                  
            int sin_size;

                  

                  
            //create tcp socket

                  printf(
            "socket.... ");

                  
            if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

                                perror(
            "creating socket failed.");

                                exit(
            1);

                  }

                  

                  
            int opt = SO_REUSEADDR;

                  setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
            &opt, sizeof(opt));

                  

                  bzero(
            &server,sizeof(server));

                  server.sin_family 
            = AF_INET;

                  server.sin_port 
            = htons(PORT);

                  server.sin_addr.s_addr 
            = htonl(INADDR_ANY);

                  printf(
            "bind.... ");

                  
            if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {

                      perror(
            "bind error.");

                      exit(
            1);

                  }

                  

                  printf(
            "listen.... ");

                  
            if(listen(listenfd,BACKLOG) == -1) {

                      perror(
            "listen() error ");

                      exit(
            1);

                  }



                  sin_size 
            = sizeof(struct sockaddr_in);

                  
            while(1)

                  {

                      
            //accept() using main thread

                      printf(
            "accepting.... ");

                      
            if((connectfd = accept(listenfd,

                                 (
            struct sockaddr *)&client,

                                 (socklen_t
            *)&sin_size)) == -1) {

                          perror(
            "accept() error ");

                          exit(
            1);

                      }



                      arg 
            = new ARG;

                      arg
            ->connfd = connectfd;

                      memcpy((
            void *)&arg->client, &client, sizeof(client));

                    

                      
            //invoke start_routine to handle this thread

                      printf(
            "thread_creating....");

                      
            if(pthread_create(&thread, NULL, start_routine, (void*)arg)){

                          perror(
            "pthread_creat() error");

                          exit(
            1);

                      }          

                  }

                  close(listenfd);      

            }



            void process_cli(int connectfd, sockaddr_in client)

            {

                
            int num;

                
            char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];

                

                printf(
            "you got a connection from %s.  ",inet_ntoa(client.sin_addr) );

                
            //get client's name from client

                num 
            = recv(connectfd, cli_name, MAXDATASIZE, 0);

                
            if(num == 0) {

                    close(connectfd);

                    printf(
            "Client disconnected. ");

                    
            return;

                }

                cli_name[num 
            - 1= '

             客戶端代碼:

            /* cthread.c */
            #include 
            <stdio.h>
            #include 
            <sys/types.h>
            #include 
            <netinet/in.h>
            #include 
            <sys/socket.h>
            #include 
            <netdb.h>
            #include 
            <unistd.h>
            #include 
            <string.h>
            #include 
            <arpa/inet.h>
            #include 
            <errno.h>
            #include 
            <stdlib.h>
            #define PORT 8848
            #define MAXDATASIZE 100

            void process(FILE *fp, int sockfd);
            char* getMessage(char* sendline, int len, FILE* fp);
            int main(int argc, char *argv[])
            {
                
            int fd;
                
            struct hostent *he;
                
            struct sockaddr_in server; //server's address info

                
            if(argc != 2) {
                    printf(
            "Usage: %s <ip address> ",argv[0]);
                    exit(
            1);
                }
                
                
            if((he = gethostbyname(argv[1])) == NULL){
                    perror(
            "gethostbyname() error");
                    exit(
            1);
                }

                
            if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
                    perror(
            "socket() error");
                    exit(
            1);
                }

                bzero(
            &server , sizeof(server));
                server.sin_family 
            = AF_INET;
                server.sin_port 
            = htons(PORT);
                server.sin_addr 
            = *((struct in_addr *)he->h_addr);

                
            if(connect(fd, (struct sockaddr *)&server,
                            
            sizeof(struct sockaddr)) == -1){
                    perror(
            "connect() error");
                    exit(
            1);
                }

                process(stdin,fd);

                close(fd);
            }

            void process(FILE *fp, int sockfd)
            {
                
            char sendline[MAXDATASIZE],recvline[MAXDATASIZE];
                
            int numbytes;

                printf(
            "connected to server. ");
                
            //send name to server
                printf("Input name:");
                
            if(fgets(sendline, MAXDATASIZE, fp) == NULL){
                    printf(
            " Exit. ");
                    
            return;
                }
                send(sockfd, sendline, strlen(sendline), 
            0);

                
            //send message to server
                
            //when the string is not NULL , send another!
                while(getMessage(sendline,MAXDATASIZE,fp) != NULL) {
                    send(sockfd, sendline, strlen(sendline), 
            0);

                    
            if((numbytes = recv(sockfd, recvline, MAXDATASIZE, 0)) == 0){
                        printf(
            "server terminated. ");
                        
            return;
                    }
                    recvline[numbytes] 
            = '

            編譯命令:

            g++ -g -o s sthread.c -pthread

            g++ -g -o c cthread.c -lc -lnsl

            啟動服務器:

            ./s

            啟動客戶端:

            ./c 127.0.0.1

            然后提示輸入客戶機的名字,再就提示輸入一串字符,然后服務器就反轉再發回來。

            posted on 2008-07-02 09:48 隨意門 閱讀(360) 評論(0)  編輯 收藏 引用

            亚洲AⅤ优女AV综合久久久| 久久亚洲国产成人精品性色| 久久精品国产亚洲Aⅴ香蕉| 色婷婷噜噜久久国产精品12p| 思思久久99热免费精品6| 欧美一区二区三区久久综| 996久久国产精品线观看| 久久久久久av无码免费看大片 | 色妞色综合久久夜夜| 久久线看观看精品香蕉国产| 精品国产一区二区三区久久蜜臀| 久久精品久久久久观看99水蜜桃| 国产欧美一区二区久久| 一本综合久久国产二区| 亚洲精品国产成人99久久| 囯产精品久久久久久久久蜜桃| 97久久精品午夜一区二区| 97精品国产97久久久久久免费| 国产激情久久久久影院| 97久久婷婷五月综合色d啪蜜芽| 国产午夜精品久久久久九九电影 | 久久国产精品免费一区| 亚洲国产精品无码久久| 久久综合九色欧美综合狠狠 | 无夜精品久久久久久| 青青青青久久精品国产h| 色偷偷偷久久伊人大杳蕉| 免费精品久久久久久中文字幕| 97久久超碰成人精品网站| 伊人久久大香线焦AV综合影院| 国产日韩久久久精品影院首页| 久久A级毛片免费观看| 亚洲中文字幕无码久久综合网| 亚洲а∨天堂久久精品| 久久成人国产精品一区二区| 久久精品这里热有精品| 久久婷婷综合中文字幕| 久久精品成人影院| 性做久久久久久久久久久| 精品久久久久久久久免费影院| 亚洲国产香蕉人人爽成AV片久久 |