многопроцессный сервер udp с форком в c - PullRequest
0 голосов
/ 21 июня 2019

Мне нужно создать новый процесс для каждого нового «соединения» с какого-нибудь клиента на моем сервере udp, сделанного в c

Мне нужно иметь несколько пользователей, так что для этого я использую fork.

моя проблема с сообщениями, полученными сервером и созданием нового процесса для каждого сообщения

Фрагмент кода иллюстрирует, проблема в том, что с каждым новым сообщением, полученным в функции recvfrom, он создает новый процесс, даже если это тот же самый осведомленный. Мне нужно для каждого нового экземпляра процесса, который клиент x, отправить сообщение в тот же процесс

 while (1) {
        printf("\UDP Server: waiting connection...");
        bytes = recvfrom (sock, (char *)&frame_recv, sizeof(Frame), MSG_WAITALL, (sock_addr*) &client, &size_client);

        if (bytes > 0) {
            buffer[bytes] = '\0';
            printf("\nServidor UDP: message -> %s", buffer);
            pid = fork();

            if (pid < 0) {
                perror("UDP Serve: ERRO in while forking \n");
                exit(1);
            }

            if (pid == 0) {
                sendto(
                   socket,
                   (const char *)&frame_send,
                   sizeof(Frame),
                   MSG_CONFIRM,
                   (sock_addr*)&server,
                   sizeof(server)
                );
            }
        }
    }

Так что для этого я использую три рукопожатия, фрагмент кода ниже сужает то, что я говорю. У меня есть первый носок для «установления» соединения, сервер отвечает подтверждением и новым портом, с которым клиент должен будет связаться, и, таким образом, создает новый процесс и запускает эту клиентскую функцию

   while (true) {
        bytes = recvfrom (sock, (char *)&frame_recv, sizeof(Frame), MSG_WAITALL, (sock_addr*) &client, &size_client);
        if(bytes > 0) {
            pid = fork();

            if(pid == 0) {
                client();
            }
            if(pid < 0) {
                perro("bad Forking");
                exit(-2);
            }
        }
    }

В этой клиентской функции я создаю новый сокет и связываю его как новый порт, и, таким образом, чтобы процесс x только слушал клиента, я получаю новое, пока в этом процессе слушаю сообщения недействительный клиент (недействительный) {

bindSock(&new_server, new_sockt);

while (true) {
    printf("PID: %i\n", getpid());

    bytes = recvfrom(new_socket, (char *) &new_frane_recv, sizeof(Frame), MSG_WAITALL, (sock_addr *) &new_client, &new_size_client);

    if (bytes > 0) {
        iniciaCliente(&(new_frane_recv), new_sockt, new_client);
    }
}

}

Моя проблема в том, что я не могу заставить ОС генерировать случайный порт, он всегда возвращает ноль, когда я использую getsockname.

Интересно, действительно ли все это, что я делаю, тоже? потому что я создаю новый процесс с одним сервером для каждого клиента.

Это работа в колледже, я имею отношение к udp и fork

извините за гигантский вопрос, я немного растерялся '-'

...