首页 > 代码库 > Linux 下 简单客户端服务器通讯模型(TCP)

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

原文: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  8typedef 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 6080typedef 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 clientserver:    server.c    gcc -o server server.c -pthreadclient:    client.c    gcc -o client client.c -pthreadclean:    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)