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

简介: 原文:Linux 下 简单客户端服务器通讯模型(TCP)服务器端:server.c #include #include #include #include #include #include #include #include #include #include ...
原文: 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

 

 


 

去年的代码,做个备份。

 

 

目录
相关文章
|
5月前
|
NoSQL IDE MongoDB
Studio 3T 2025.11 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
Studio 3T 2025.11 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
352 3
|
1月前
|
Linux 虚拟化 iOS开发
VMware Remote Console 13.0.1 for macOS, Linux, Windows - vSphere 虚拟机控制台的桌面客户端
VMware Remote Console 13.0.1 for macOS, Linux, Windows - vSphere 虚拟机控制台的桌面客户端
355 0
VMware Remote Console 13.0.1 for macOS, Linux, Windows - vSphere 虚拟机控制台的桌面客户端
|
2月前
|
NoSQL IDE MongoDB
Studio 3T 2025.17 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
Studio 3T 2025.17 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
267 1
Studio 3T 2025.17 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
|
3月前
|
弹性计算 安全 Linux
阿里云服务器ECS安装宝塔Linux面板、安装网站(新手图文教程)
本教程详解如何在阿里云服务器上安装宝塔Linux面板,涵盖ECS服务器手动安装步骤,包括系统准备、远程连接、安装命令执行、端口开放及LNMP环境部署,手把手引导用户快速搭建网站环境。
|
5月前
|
NoSQL IDE MongoDB
Studio 3T 2025.10 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
Studio 3T 2025.10 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
440 21
Studio 3T 2025.10 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
|
5月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
926 21
|
4月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
522 13
|
4月前
|
Linux 虚拟化 iOS开发
VMware Remote Console 13.0.0 for macOS, Linux, Windows - vSphere 虚拟机控制台的桌面客户端
VMware Remote Console 13.0.0 for macOS, Linux, Windows - vSphere 虚拟机控制台的桌面客户端
1009 0
VMware Remote Console 13.0.0 for macOS, Linux, Windows - vSphere 虚拟机控制台的桌面客户端
|
4月前
|
监控 Linux 网络安全
FinalShell SSH工具下载,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux
FinalShell是一款国人开发的多平台SSH客户端工具,支持Windows、Mac OS X和Linux系统。它提供一体化服务器管理功能,支持shell和sftp同屏显示,命令自动提示,操作便捷。软件还具备加速功能,提升访问服务器速度,适合普通用户和专业人士使用。
1230 0
|
4月前
|
存储 安全 Linux
Linux服务器上安装配置GitLab的步骤。
按照以上步骤,一个基础的GitLab服务应该运行并可以使用。记得定期检查GitLab官方文档,因为GitLab的安装和配置步骤可能随着新版本而变化。
385 0

热门文章

最新文章

下一篇
oss云网关配置