我正在构建一个DNS客户端。子进程通过UDP套接字处理请求,而父进程处理回复。我需要父母知道发送了多少字节,以便打印URL。我用pipe()
尝试了以下方法childPID = fork();
pipe(fd);
if(childPID == 0){
close(fd[0]);
sent_bytes = sendDNS(sock_udp, &serverAddr, argv[2]);
memcpy(in_buf, &sent_bytes, sizeof(sent_bytes));
write(fd[1], in_buf, sizeof(sent_bytes));
exit(0);
}
else{
close(fd[1]);
int inBytes = -1;
struct sockaddr reply_addr;
n = sizeof(reply_addr);
while(inBytes < 0){
inBytes = recvfrom(sock_udp, buffer, DNS_MAX_RESPONSE, 0, &reply_addr, (socklen_t*)&n);
read(fd[0], out_buf, sizeof(sent_bytes));
memcpy(pipe_msg, out_buf, sizeof(sent_bytes));
printDNSmsg((struct dnsReply*)buffer);
}
}
但是GDB显示了在子进程上收到的SIGPIPE。我错过了什么?
您将如何打印DNS回复(可变长度缓冲区)?
答案 0 :(得分:0)
当然,您需要在 pipe()
之前致电fork()
。但你实际上并没有在任何地方使用这些信息。为什么你关心发送了多少字节,只要你得到答复?为什么要在单独的线程中进行UDP发送,更不用说单独的进程了?这一切似乎都毫无意义。