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  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:

[email protected]:/mnt/hgfs/E/Lessons/个人总结/chat# ./server

client said: hello

hehe

client said: g

client said: goodbay

client:

[email protected]:/mnt/hgfs/E/Lessons/个人总结/chat# ./client
hello

server said : hehe

s^Hg
goodbay



去年的代码,做个备份。

时间: 2024-09-29 01:12:13

Linux 下 简单客户端服务器通讯模型(TCP)的相关文章

linux-socket tcp客户端服务器编程模型及代码详解

上一篇文章介绍了 TCP/IP相关协议,socket通信流程和涉及到的各种函数: Socket简单理解 本篇将具体解释tcp客户端服务器编程模型相关的代码 文章分为4个部分: 1. TCP客户端服务器编程模型流程图 2. 网络字节序与主机字节序 3. TCP编程的地址结构 4. 详细案例代码及解释 一: TCP客户端服务器编程模型流程图 上面两张图片将整个流程已经说明的很清楚了; 二: 网络字节序与主机字节序 字节序即是保存数据的方向方式, 分为 大端存储 和 小端存储; 其中 网络字节序 使用

Linux下简单的socket通信实例

Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Bruce Lee       学习网络编程也一段时间了,刚开始看<UNIX网络编程>的时候,觉得这本厚厚的书好难啊!看到后来,发现并没有想象中的那么难.如果你是新手,建议你看到第二部分结束后,开始着手写代码.不写代码肯定是不行的.看100遍也没有敲一遍实现一遍来的清楚.敲完以后,带着问题去看书,你会

一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Logger 使用示例 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) 最近写了点关于Http上传下载文件相关的,于是今天整理下代码. Http协议简述 HttpRequest类设计 使用示例 Http协议简述 协议:网络协议的简称,网络协议是通信计算机双方必须共同遵从

Linux 下基于多线程服务器/客服端聊天程序源码

Linux 下基于多线程服务器/客服端聊天程序,采用阻塞的socket技术,和多线程技术实现. 客服端程序:client.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>

linux下配置samba服务器

linux下配置samba服务器 1. 什么是samba Samba服务类似于windows上的共享功能,可以实现在Linux上共享文件,windows上访问,当然在Linux上也可以访问到. 是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务. 2.安装配置samba 安装命令:yum install -y samba samba-client 配置文件:/etc/samba/smb.conf [global] workgroup = 

linux下smb文件共享服务器详解

1.smb服务器,netbios工作端口137/udp,138/udp,139/tcp,共享文件工作端口445/tcp 2.smb服务器主要是运行在linux与windows之间的文件共享服务, 安全级别有user,share,server,domain四种 user:相当于使用用户认证 share:相当于匿名访问 server:相当于在另一台服务器上用户认证 domain:相当于使用windows AD域用户认证 3.smb认证用户有3种,分为本地系统,非本地服务器上的帐号和windows的A

Linux下ORACLE客户端安装详解

1.首先去oracle官网下载以下安装包(http://www.oracle.com/technetwork/topics/linuxsoft-082809.html) instantclient-basic-linux.x64-11.2.0.3.0.zip instantclient-odbc-linux-11.2.0.3.0.zip instantclient-sdk-linux.x64-11.2.0.3.0.zip instantclient-sqlplus-linux.x64-11.2.

在linux下配置tftp服务器和nfs服务器

提示:该实验平台是在RedHatb6下进行的 配置成功的前提有三个: (1):在window下能ping的通linux (2):关闭linux 防火墙      执行指令:/etc/init.d/iptables stop (3):使SElinux处于宽容模式   执行指令:setenforce permissive 一.配置tftp服务器步骤 (1):挂载磁盘,安装tptp-server软件包 mount /dev/cdrom    /mnt/                        

Linux下搭建Apache服务器(完整版)

Linux下搭建Apache服务器(完整版) 什么是Apache? Apache Licence是著名的非盈利开源组织Apache采用的协议.该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件).需要满足的条件也和BSD类似 Apache主要特点 1.开放源代码.跨平台应用 2.支持多种网页编程语言 3.模块化设计 .运行稳定.良好的安全性 Apache软件版本 1.X  1.目前最高版本是1.3,运行稳定  2.向下兼容性较好,但缺乏一些较新