Linux 下 简单客户端服务器通讯模型(TCP)

系统 1601 0
原文: Linux 下 简单客户端服务器通讯模型(TCP)

服务器端:server.c

      #include<stdio.h>
      
        

#include
      
      <stdlib.h>
      
        

#include
      
      <errno.h>
      
        

#include
      
      <
      
        string
      
      .h>
      
        

#include
      
      <sys/socket.h>
      
        

#include
      
      <sys/types.h>
      
        

#include 
      
      <stdio.h>
      
        

#include 
      
      <unistd.h>
      
        

#include 
      
      <netdb.h>
      
        

#include 
      
      <netinet/
      
        in
      
      .h>




      
        #define
      
       ServerPort 6080


      
        #define
      
       MaxUser  8
      
        





typedef 
      
      
        struct
      
      
         _server{

    

    
      
      
        int
      
      
         sock_fd;



    
      
      
        int
      
      
         new_fd;



    
      
      
        struct
      
      
         sockaddr_in my_addr;



} Server;



typedef 
      
      
        struct
      
      
         _client{

    

    
      
      
        int
      
      
         sock_fd;

    

    
      
      
        struct
      
      
         sockaddr_in my_addr;



} Client;








      
      
        static
      
       Server  *
      
        server;




      
      
        static
      
       Client  *
      
        client;








      
      
        void
      
       socket_server_init(Server *
      
         server){



    server 
      
      -> my_addr.sin_family =
      
         AF_INET;

    

    server 
      
      -> my_addr.sin_port =
      
         htons(ServerPort);

    

    server 
      
      -> my_addr.sin_addr.s_addr =
      
         INADDR_ANY;

        

    bzero(
      
      &(server -> my_addr.sin_zero),
      
        8
      
      
        );



}




      
      
        int
      
       socket_server_create_bind_listen(Server *
      
         server){



    
      
      
        int
      
      
         sin_size,ret, on;

    

    
      
      
        if
      
      ((server -> sock_fd = socket(AF_INET,SOCK_STREAM,
      
        0
      
      )) == -
      
        1
      
      
        ){

        

        perror(
      
      
        "
      
      
        faild to create socket :\n
      
      
        "
      
      
        );

    

        
      
      
        return
      
       -
      
        1
      
      
        ;

    }

    on 
      
      = 
      
        1
      
      
        ;

    

    ret 
      
      = setsockopt( server -> sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, 
      
        sizeof
      
      
        (on) );



    
      
      
        if
      
      (ret=bind(server ->
      
         sock_fd,

        (
      
      
        struct
      
       sockaddr *)&server ->
      
         my_addr,

        
      
      
        sizeof
      
      (
      
        struct
      
       sockaddr))==-
      
        1
      
      
        ){

        

        perror(
      
      
        "
      
      
        failed to bind \n
      
      
        "
      
      
        );

        

        
      
      
        return
      
       -
      
        1
      
      
        ;

    

    }

    
      
      
        if
      
      (listen(server -> sock_fd,MaxUser)==-
      
        1
      
      
        ){

    

        perror(
      
      
        "
      
      
        failed to listen \n
      
      
        "
      
      
        );

    

        
      
      
        return
      
       -
      
        1
      
      
        ;

    }

    

    
      
      
        return
      
      
        1
      
      
        ;

}




      
      
        void
      
       server_send_msg(
      
        int
      
      
         fd){



    
      
      
        char
      
       buff[
      
        1024
      
      
        ];



    
      
      
        while
      
      (
      
        1
      
      
        ){



        fgets(buff,
      
      
        1024
      
      
        ,stdin);



        
      
      
        if
      
      (send(fd,buff,
      
        1024
      
      ,
      
        0
      
      )==-
      
        1
      
      
        ){



            perror(
      
      
        "
      
      
        error to send :
      
      
        "
      
      
        );

            

            
      
      
        break
      
      
        ;

        }



    }



}






      
      
        void
      
       server_wait_service(Server *server,Client *
      
        client){



    
      
      
        int
      
      
         new_fd ,ret,sin_size;



    
      
      
        char
      
       buf[
      
        1024
      
      
        ];



    pthread_t tid;



    sin_size 
      
      = 
      
        sizeof
      
      (client ->
      
        my_addr);



    new_fd 
      
      = accept(server ->sock_fd,(
      
        struct
      
       sockaddr *)&client->my_addr,&
      
        sin_size);



    
      
      
        if
      
      (new_fd <= 
      
        0
      
      
         ){

            

        perror(
      
      
        "
      
      
        accept error :
      
      
        "
      
      
        );

        

    }
      
      
        else
      
      
        {

    

        ret 
      
      = pthread_create(&
      
        tid,NULL,server_send_msg,new_fd);



        
      
      
        if
      
      (ret!=
      
        0
      
      
        ){



            perror(
      
      
        "
      
      
        error to create pthread
      
      
        "
      
      
        );



        }

        
      
      
        while
      
      (
      
        1
      
      
        ){

            
      
      
        if
      
      (recv(new_fd,buf,
      
        sizeof
      
      (buf),
      
        0
      
      )>
      
        0
      
      
        ){



                printf(
      
      
        "
      
      
        \nclient said:\t\t%s\n
      
      
        "
      
      
        ,buf);



            }

        }

    }

}








      
      
        int
      
       main(
      
        int
      
       arg, 
      
        char
      
       *
      
         argv[]){

    

    server 
      
      = (Server *)malloc(
      
        sizeof
      
      
        (Server));



    client 
      
      = (Client *)malloc(
      
        sizeof
      
      
        (Client));



    socket_server_init(server);



    
      
      
        if
      
      
        (socket_server_create_bind_listen(server)){

    

        server_wait_service(server,client);

    

    }

    

    
      
      
        return
      
      
        0
      
      
        ;



}
      
    

客户端代码:client.c

      #include<stdio.h>
      
        

#include
      
      <stdlib.h>
      
        

#include
      
      <errno.h>
      
        

#include
      
      <
      
        string
      
      .h>
      
        

#include
      
      <sys/socket.h>
      
        

#include
      
      <sys/types.h>
      
        

#include 
      
      <stdio.h>
      
        

#include 
      
      <netdb.h>






      
        #define
      
       ServerPort 6080
      
        



typedef 
      
      
        struct
      
      
         _server{

    

    
      
      
        int
      
      
         sock_fd;



    
      
      
        int
      
      
         new_fd;



    
      
      
        struct
      
      
         sockaddr_in my_addr;



} Server;



typedef 
      
      
        struct
      
      
         _client{

    

    
      
      
        int
      
      
         sock_fd;

    

    
      
      
        struct
      
      
         sockaddr_in my_addr;



} Client;



Server 
      
      *
      
        server;



Client 
      
      *
      
        client;






      
      
        void
      
       socket_server_init(Server *
      
         server){



    server 
      
      -> my_addr.sin_family =
      
         AF_INET;

    

    server 
      
      -> my_addr.sin_port =
      
         htons(ServerPort);

    

    server 
      
      -> my_addr.sin_addr.s_addr =
      
         INADDR_ANY;

        

    bzero(
      
      &(server -> my_addr.sin_zero),
      
        8
      
      
        );



}




      
      
        void
      
       socket_client_init(Client *
      
         client){



    client 
      
      -> my_addr.sin_family =
      
         AF_INET;

    

    client 
      
      -> my_addr.sin_port = htons(ServerPort+
      
        10
      
      
        );

    

    client 
      
      -> my_addr.sin_addr.s_addr =
      
         INADDR_ANY;

        

    bzero(
      
      &(client -> my_addr.sin_zero),
      
        8
      
      
        );



}




      
      
        int
      
       socket_client_create_connect(Server * server,Client *
      
         client){

    

    
      
      
        if
      
      ((client -> sock_fd = socket(AF_INET,SOCK_STREAM,
      
        0
      
      )) == -
      
        1
      
      
        ){

    

        perror(
      
      
        "
      
      
        failed to create client socket \n
      
      
        "
      
      
        );

        

        
      
      
        return
      
       -
      
        1
      
      
        ;

    

    }

    

    
      
      
        else
      
      
        if
      
      (connect(client ->
      
        sock_fd,

        (
      
      
        struct
      
       sockaddr *)&server ->
      
        my_addr,

        
      
      
        sizeof
      
      (server ->my_addr))==-
      
        1
      
      
        ){

        

        printf(
      
      
        "
      
      
        failed to connect the server \n
      
      
        "
      
      
        );

        

        
      
      
        return
      
       -
      
        1
      
      
        ;

        

    }
      
      
        else
      
      
        return
      
      
        1
      
      
        ;



}




      
      
        void
      
       client_recv_msg(Client *
      
        client){



    
      
      
        char
      
       buf[
      
        1024
      
      
        ];



    
      
      
        while
      
      (
      
        1
      
      
        ){



        
      
      
        if
      
      (recv(client->sock_fd,buf,
      
        sizeof
      
      (buf),
      
        0
      
      )>
      
        0
      
      
        ){

                        

            printf(
      
      
        "
      
      
        \nserver said :\t\t%s\n
      
      
        "
      
      
        ,buf);

            

        }
      
      
        else
      
      
        break
      
      
        ;

    }



}






      
      
        int
      
       main(
      
        int
      
       argc,
      
        char
      
      *
      
         argv[]){

    

    server 
      
      = (Server *)malloc(
      
        sizeof
      
      
        (Server));

    

    client 
      
      = (Client *)malloc(
      
        sizeof
      
      
        (Client));



    
      
      
        char
      
       data[
      
        1024
      
      
        ];

    

    socket_server_init(server);

    

    socket_client_init(client);

    

    pthread_t tid;



    
      
      
        if
      
      
        (socket_client_create_connect(server,client)){



        pthread_create(
      
      &
      
        tid, NULL,client_recv_msg, client);



        
      
      
        while
      
      (
      
        1
      
      
        ){

                

            fgets(data,
      
      
        1024
      
      
        ,stdin);



            
      
      
        if
      
      (send(client->sock_fd,data,
      
        1024
      
      ,
      
        0
      
      )==-
      
        1
      
      
        ){



                perror(
      
      
        "
      
      
        error to send :
      
      
        "
      
      
        );



                
      
      
        break
      
      
        ;

            }

        }

    }

    

    
      
      
        return
      
      
        0
      
      
        ;

}
      
    

Makefile: 

      
        all:    server client



server:    server.c



    gcc 
      
      -o server server.c -
      
        pthread



client:    client.c



    gcc 
      
      -o client client.c -
      
        pthread



clean:

    rm 
      
      -f server client
    

执行效果:

server:

root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./server

client said: hello

hehe

client said: g


client said: goodbay

client:

root@ubuntu:/mnt/hgfs/E/Lessons/个人总结/chat# ./client
hello

server said : hehe

s^Hg
goodbay

 

 


 

去年的代码,做个备份。

 

 

Linux 下 简单客户端服务器通讯模型(TCP)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论