首页 > 解决方案 > 套接字服务器如何在c中连接从多个客户端发送的字符串?

问题描述

我正在用 C 语言制作一个带有多个客户端的套接字服务器。
为了处理客户端的访问,在服务器中使用了函数 fork()。

我制作了子进程从客户端接收每个字符串的源代码,父进程将这些字符串连接到一个字符串。

要将字符串发送到父进程,还使用了函数 pipe()。

但是客户端在从服务器发送连接字符串之前关闭了文件描述。

我编写了函数 write 必须在连接字符串后执行的代码。

我怎样才能将所有连接的字符串发送给每个客户?

在此处输入图像描述

客户输入了二,三已经关闭。

服务器代码

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

#define MAXLINE 1024
#define PORTNUM 3600

int main(int argc, char **argv)
{
    int p1[2];
    int p2[2];

    pipe(p1);
    pipe(p2);
    int index = 0;
    char channel[100];
    char full_str[MAXLINE];
    char recv[MAXLINE];

    int listen_fd, client_fd;
    pid_t pid;
    socklen_t addrlen;
    int readn;
    char buf[MAXLINE];
    struct sockaddr_in client_addr, server_addr;

    if( (listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        return 1;
    }
    memset((void *)&server_addr, 0x00, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(PORTNUM);

    if(bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) ==-1)
    {
        perror("bind error");
        return 1;
    }
    if(listen(listen_fd, 5) == -1)
    {
        perror("listen error");
        return 1;
    }

    signal(SIGCHLD, SIG_IGN);
    while(1)
    {
        addrlen = sizeof(client_addr);
        client_fd = accept(listen_fd,
            (struct sockaddr *)&client_addr, &addrlen);
        if(client_fd == -1)
        {
            printf("accept error\n");
            break;
        }
        pid = fork();
        if(pid == 0)
        {
            close( listen_fd );
            memset(buf, 0x00, MAXLINE);
            while((readn = read(client_fd, buf, MAXLINE)) > 0)
            {
                printf("Read Data %s(%d) : %s", inet_ntoa(client_addr.sin_addr), client_addr.sin_port, buf);

                close(p1[0]);
                write(p1[1], buf, sizeof(buf)+1);

                close(p2[1]);
                read(p2[0], recv, MAXLINE);

                if(strlen(recv) != 0) {
                    write(client_fd, buf, strlen(buf));
                }

                memset(buf, 0x00, MAXLINE);
            }
            close(client_fd);
            return 0;
        }
        else if( pid > 0) {
            close(p1[1])
            read(p1[0], channel, 100);
            strcat(full_str, channel)

            index++;

            if(index >= 3) {
                close(p2[0]);
                write(p2[1], full_str, MAXLINE);
            }
            close(client_fd);
        }
    }
    return 0;
}

客户代码

#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;
}

标签: csockets

解决方案


推荐阅读