2015-11-25 43 views
0

我正在构建DNS客户端。子进程通过UDP套接字处理请求,而父进程处理回复。我需要父母知道发送了多少个字节,才能打印这些URL。我试着用管下面的方法()DNS客户端上的断管信号

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

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