• 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


    去年的代码,做个备份。

  • 相关阅读:
    【poj3017】 Cut the Sequence
    【vijos1243】 生产产品
    【bzoj3624】Apio2008—免费道路
    【bzoj1912】 Apio2010—patrol 巡逻
    【bzoj2006】 NOI2010—超级钢琴
    【bzoj1178】 Apio2009—CONVENTION会议中心
    【bzoj1503】 NOI2004—郁闷的出纳员
    【bzoj1499】 NOI2005—瑰丽华尔兹
    【poj2823】 Sliding Window
    【poj3264】 Balanced Lineup
  • 原文地址:https://www.cnblogs.com/xiaowenhu/p/xiaotiger_3.html
Copyright © 2020-2023  润新知