如何将server收到来自多个client的信息整合再返送给各个client?

图片说明
Linux系统中,用3个Client给Server各发送1条信息,然后Server将信息连起来发送回所有Client,效果如下:
图片说明
图片说明
该如何修改client.c和server.c的代码?

代码如下
client.c

#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <stdio.h> 
#include <string.h>
#include <unistd.h> 

#define MAXLINE    1024

int main(int argc, char **argv)
{
    struct sockaddr_in serveraddr;
    int server_sockfd;
    int client_len;
    char buf[MAXLINE];

    if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
    {
        perror("error :");
        return 1;
    }

    /* 指定服务器地址和端口号协议来请求连接 */
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serveraddr.sin_port = htons(3600);

    client_len = sizeof(serveraddr);

    /* 尝试连接到服务器 */
    if (connect(server_sockfd, (struct sockaddr *)&serveraddr, client_len)  == -1)
    {
        perror("connect error :");
        return 1;
    }

    memset(buf, 0x00, MAXLINE);
    read(0, buf, MAXLINE);    /* 等待键盘输入 */
    if (write(server_sockfd, buf, MAXLINE) <= 0) /* 将接收到的数据发送到服务器 */
    {
        perror("write error : ");
        return 1;
    }
    memset(buf, 0x00, MAXLINE);
    /* 从服务器读取数据 */
    if (read(server_sockfd, buf, MAXLINE) <= 0)
    {
        perror("read error : ");
        return 1;
    }
    printf("read : %s", buf);
    close(server_sockfd);
    return 0;
}

——————————————————————————————————————————————————————————
server.c

#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define MAXBUF 1024


int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int client_len, n;
    char buf[MAXBUF];
    struct sockaddr_in clientaddr, serveraddr;
    client_len = sizeof(clientaddr);
    if ((server_sockfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP )) == -1)
    {
        perror("socket error : ");
        exit(0);
    }
    memset(&serveraddr, 0x00, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(atoi(argv[1]));

    bind (server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
    listen(server_sockfd, 5);

    while(1)
    {
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
            &client_len);
        printf("New Client Connect: %s\n", inet_ntoa(clientaddr.sin_addr));
        memset(buf, 0x00, MAXBUF);
        if ((n = read(client_sockfd, buf, MAXBUF)) <= 0)
        {
            close(client_sockfd);
            continue;
        }
        if (write(client_sockfd, buf, MAXBUF) <=0)
        {
            perror("write error : ");
            close(client_sockfd);
        }
        close(client_sockfd);
    }
    close(server_sockfd);
    return 0;
}