c语言写两个进程 每个进程都能接收发送,udp聊天程序
时间: 2024-10-09 09:06:50 浏览: 49
在C语言中编写一个多进程的UDP聊天程序通常涉及以下几个步骤:
1. **创建套接字**:
- 主进程中,分别创建一个UDP服务器套接字和一个客户端套接字用于监听和连接。
2. **主进程部分**:
- 服务器端启动一个无限循环,等待客户端连接请求。
- 当收到连接请求时,创建一个新的子进程处理这个连接,并关闭原始服务器套接字。
3. **子进程部分**:
- 子进程负责与特定客户端通信,它会从父进程接收客户信息并开始接收数据。
- 接收数据时,对每个消息解析并转发给对应的客户端,如果需要的话还要维护一个消息队列。
4. **消息传递**:
- 使用`recvfrom()`函数从套接字接收数据,同时利用`sendto()`将消息发送到指定地址。
5. **错误处理**:
- 要处理可能出现的网络错误、超时、断开等异常情况。
6. **终止与关闭**:
- 客户端退出时,通知服务器,然后关闭各自的套接字,并在所有客户端连接完成后结束进程。
下面是一个简化的示例框架(注意这只是一个基本的结构,实际代码需要更详细的错误检查和用户交互逻辑):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAX_PACKET_SIZE 1024
// 创建子进程处理客户端连接
pid_t start_client(int server_sock, struct sockaddr_in client_addr) {
// 在这里处理客户端连接...
}
int main() {
int server_sock = socket(AF_INET, SOCK_DGRAM, 0);
// 设置服务器地址和端口...
bind(server_sock, ...);
while (1) {
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
char buffer[MAX_PACKET_SIZE];
if (recvfrom(server_sock, buffer, MAX_PACKET_SIZE, 0, (struct sockaddr*)&client_addr, &addr_len) > 0) {
pid_t client_pid = fork();
if (client_pid == 0) { // 子进程
start_client(server_sock, client_addr);
} else if (client_pid > 0) { // 父进程
// 关注子进程状态
} else {
perror("Fork failed");
}
}
}
close(server_sock);
return 0;
}
```
阅读全文