DNS客户端上的管道信号损坏

时间:2015-11-25 02:57:21

标签: process dns udp pipe fork

我正在构建一个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回复(可变长度缓冲区)?

1 个答案:

答案 0 :(得分:0)

当然,您需要在 pipe()之前致电fork() 。但你实际上并没有在任何地方使用这些信息。为什么你关心发送了多少字节,只要你得到答复?为什么要在单独的线程中进行UDP发送,更不用说单独的进程了?这一切似乎都毫无意义。