c - c语言中带有fork的udp服务器多进程
问题描述
我需要为我的 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)
);
}
}
}
所以为了做到这一点,我使用了三次握手,下面的代码片段缩小了我所说的范围。我有第一个 sock 来“建立”连接,服务器以 ack 和客户端必须与之通信的新端口进行响应,从而创建新进程并启动该客户端功能
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 仅在侦听客户端,在该进程中我得到一个新的同时侦听消息 void client(void) {
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
对不起这个巨大的问题,我有点迷路'-'
解决方案
推荐阅读
- oracle-apex - 如果没有为特定列返回数据,如何将条件显示添加到交互式网格列
- arrays - 如何根据对象数组更新复杂的 json 对象
- git - 在另一个功能分支中启动一个功能分支
- python - 如何在 Odoo 13 CE 中有效地隐藏字段?
- reactjs - 材质ui抽屉位置
- blockchain - Corda 中的 BNO 如何执行 KYC?
- r - 通过 R 运行可执行的 *.exe 文件
- azure-devops - 服务器端的 Azure git 签入策略预接收策略
- node.js - req.get('主机'); 给出一个双域
- vue.js - vue add i18n 在使用 vuejs3 和 @vue/cli 4.5.4 时遇到错误,该错误是什么意思以及如何调试?