несколько клиентских процессов подключаются к 1 серверному процессу - PullRequest
1 голос
/ 30 мая 2020

Я делаю C программу сокета, в которой 1 серверный процесс взаимодействует с 1 клиентским процессом из всех 4 процессов по очереди.

Более конкретно, когда клиент и сервер общаются друг с другом 10 сообщений ( 5 сообщений для каждого), другой клиент, ожидающий подключения к серверу, подключается и делает то же самое. У каждого клиента должны быть разные порты (8000-8003) при подключении.

Я думаю, что моя программа ниже взаимодействует только с 1 клиентом, который соответствует тому же порту, что и сервер (8000).

Что мне делать с этим, если должен быть только 1 серверный процесс и 4 клиентских процесса, использующих разные порты?

снимок экрана с клиента enter image description here

скриншот с сервера enter image description here

клиент. c

#define _POSIX_SOURCE
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

int main(int argc, const char * argv[]) {
    int c_socket_fd;
    struct sockaddr_in server_address;
    char fromServer[100];
    int str_len;
    int PORT = 8000;


    int count = 0; 

    int status; 
    pid_t wait_pid;

    pid_t pid = fork();

    if (pid < 0) {
        printf("fork failed!\n");
        return 0;
    } else if (pid == 0) {
        // P-C1
        pid = fork();
        if (pid < 0) {
            printf("fork failed!\n");
            return 0;
        } else if (pid == 0) {
            // P-C1-C3
            PORT = 8003;
        } else if (pid > 0) {
            // P-C1
            PORT = 8001;
        }
    } else if (pid > 0) {
        // P
        pid = fork();
        if (pid < 0) {
            printf("fork failed!\n");
            return 0;
        } else if (pid == 0) {
            // P-C2
            PORT = 8002;
        } else if (pid > 0) {
            // P
            PORT = 8000;
        }
    }

    printf("pid: %d ppid: %d\n", pid, getppid());

    c_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
    printf("Created Client Socket\n");

    memset(&server_address, 0, sizeof(server_address));

    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_address.sin_port = htons(PORT);

    if(connect(c_socket_fd, (struct sockaddr*)&server_address, sizeof(server_address)) == 0) {
        printf("Connected Server\n");

        while (1) {
            char toServer[100] = "Hello Server, this is message No. ";
            char* ch = toServer;

            while (*ch != '\0') {
                ch++;
            }

            *ch = ('0' + count);
            ch++;
            char temp[7] = " from ";
            char* temp_ch = temp;
            while(*temp_ch != '\0') {
                *ch = *temp_ch;
                temp_ch++;
                ch++;
            }

            int process_id = pid;
            if (process_id >= 10000) {
                char temp[6] = {0,};
                sprintf(temp, "%d", process_id);
                char* temp_ch = temp;
                while(*temp_ch != '\0') {
                    *ch = *temp_ch;
                    temp_ch++;
                    ch++;
                }
            } else if (process_id >= 1000) {
                char temp[5] = {0,};
                sprintf(temp, "%d", process_id);
                char* temp_ch = temp;
                while(*temp_ch != '\0') {
                    *ch = *temp_ch;
                    temp_ch++;
                    ch++;
                }
            } else if (process_id >= 100) {
                char temp[4] = {0,};
                sprintf(temp, "%d", process_id);
                char* temp_ch = temp;
                while(*temp_ch != '\0') {
                    *ch = *temp_ch;
                    temp_ch++;
                    ch++;
                }
            } else if (process_id >= 10) {
                char temp[3] = {0,};
                sprintf(temp, "%d", process_id);
                char* temp_ch = temp;
                while(*temp_ch != '\0') {
                    *ch = *temp_ch;
                    temp_ch++;
                    ch++;
                }
            } else {
                char temp[2] = {0,};
                sprintf(temp, "%d", process_id);
                char* temp_ch = temp;
                while(*temp_ch != '\0') {
                    *ch = *temp_ch;
                    temp_ch++;
                    ch++;
                }
            }

            ch++;
            *ch = '\0';

            count++;
            if (count > 5) {
                if (pid > 0)
                wait_pid = wait(&status);
                if (wait_pid != -1)
                    break;
            }

            write(c_socket_fd, toServer, sizeof(toServer));

            read(c_socket_fd, fromServer, sizeof(fromServer));
            printf("From Server: %s\n", fromServer);
        }

        close(c_socket_fd);
    }

    return 0;
}

сервер. c

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

#define PORT 8000

int main() {
    int s_socket_fd, c_socket_fd;
    struct sockaddr_in server_address, client_address;
    socklen_t client_address_size = sizeof(client_address);

    char toClient[100] = "Hello Client, this is my reply for your message No. ";
    char fromClient[100];

    s_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
    if (s_socket_fd == -1) {
        printf("socket create failed!\n");
        close(s_socket_fd);
        return 0;
    }
    printf("Server Socket Created!\n");

    memset(&server_address, 0, sizeof(server_address));

    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(PORT);

    if ((bind(s_socket_fd, (struct sockaddr*) &server_address, sizeof(server_address))) == -1) {
        printf("bind failed!\n");
        close(s_socket_fd);
        return 0;
    }

    if ((listen(s_socket_fd, 10) == -1)) {
        printf("listen failed!\n");
        close(s_socket_fd);
        return 0;
    }
    printf("Waiting Client...\n");

    client_address_size = sizeof(client_address);
    c_socket_fd = accept(s_socket_fd, (struct sockaddr*) &client_address, &client_address_size);
    if (c_socket_fd == -1) {
        printf("accept failed!\n");
        close(c_socket_fd);
        close(s_socket_fd);
        return 0;
    }
    printf("Client Connected!\n");

    while(1) {
        read(c_socket_fd, fromClient, sizeof(fromClient));
        printf("From Client message: %s\n", fromClient);

        char* count = strstr(fromClient, " from");
        count--;
        char* temp_ch = toClient;
        while (*temp_ch != '\0') {
            temp_ch++;
        }
        *(temp_ch-1) = *count;

        write(c_socket_fd, toClient, sizeof(toClient));
    }


    close(c_socket_fd);
    close(s_socket_fd);

    return 0;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...