2015-11-25 1 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 в отдельный поток, не говоря уже о отдельном процессе? Все это кажется совершенно бессмысленным.

Смежные вопросы