Мне нужно создать новый процесс для каждого нового «соединения» с какого-нибудь клиента на моем сервере 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
извините за гигантский вопрос, я немного растерялся '-'