Linux Socket 多客户端通信

搞了一下午的Linux套接字,实现了多客户端之间的TCP通信。不想再码字了,就简单描述一下代码流程,直接把代码贴出来吧。
服务端多线程的思路主要参考了这篇:Linux C利用Socket套接字进行服务器与多个客户端进行通讯
感觉自己对线程和TCP的理解也不是特别清晰,以下内容有不会的地方请大家指正

程序说明

  1. 实现了多客户端之间的TCP通信
  2. 可以更改最大客户端数量
  3. 使用多线程处理客户端链路
  4. 使用父子进程实现客户端数据收发

程序流程

客户机

  • 客户端只需考虑如何连接目标服务器即可
  • 客户端首先创建套接字并向服务器附送网络连接请求
  • 连接到服务器之后,创建子进程
  • 父进程用来向服务器发送数据,子进程从服务器接收数据

服务器

  • 服务器首先创建套接字并绑定网络信息
  • 之后创建一个子线程用于接收客户端的网络请求
  • 在子线程中接收客户端的网络请求,并为每一个客户端创建新的子线程,该子线程用于服务器接收客户端数据
  • 服务器的主线程用于向所有客户端循环发送数据
  • 服务端大概流程如下图所示
    Linux Socket 多客户端通信_第1张图片

程序代码

服务端程序

/********************************************************************
*   File Name: server.c
*   Description: 用于实现多客户端通信
*   Others: 
*     1. 服务器首先创建套接字并绑定网络信息
*     2. 之后创建一个子线程用于接收客户端的网络请求
*     3. 在子线程中接收客户端的网络请求,并为每一个客户端创建新的子线程,该子线程用于服务器接收客户端数据
*     4. 服务器的主线程用于向所有客户端循环发送数据
*   Init Date: 2020/05/24
*********************************************************************/
#include "mysocket.h"

int main()
{
   
    ReadToSend = 0;
    conClientCount = 0;
    thrReceiveClientCount = 0;

    printf("Start Server...\n");

    /* 创建TCP连接的Socket套接字 */
    int socketListen = socket(AF_INET, SOCK_STREAM, 0);
    if(socketListen < 0){
   
        printf("Fail to create Socket\n");
        exit(-1);
    }else{
   
        printf("Create Socket successful.\n");
    }

    /* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    // 这里的地址使用所有本地网络设备的地址,表示服务器会接收任意地址的客户端信息
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(SERVER_PORT);

    /* 将套接字绑定到服务器的网络地址上 */
    if(bind(socketListen, (struct sockaddr *)&server_addr,sizeof(struct sockaddr)) != 0){
   
        perror("bind error");
		exit(-1);
    }
    printf("call bind() successful\n");

    /* 开始监听相应的端口 */
    if(listen(socketListen, 10) != 0){
   
        perror("call listen()");
        exit(-1);
    }
    printf("call listen() successful\n");

    /* 创建一个线程用来接收客户端的连接请求 */
    pthread_t thrAccept;
    pthread_create(&thrAccept, NULL, fun_thrAcceptHandler, &socketListen);

    /* 主线程用来向所有客户端循环发送数据 */
    while(1){
   
        if(ReadToSend){
   
            // 判断线程存活数量
            int i;
            for(i = 0; i < thrReceiveClientCount; i++){
   
                if(checkThrIsKill(arrThrReceiveClient[i])){
   
                    printf("A Thread has been killed\n");
                    thrReceiveClientCount --;
                }
            }
            printf("Number of connected client: %d\n", thrReceiveClientCount);
            if<

你可能感兴趣的:(嵌入式Linux,Linux,Socket,TCP,多客户端,线程)