当父母发生某些事情时,父母过程如何告诉孩子做某事?

时间:2012-10-18 14:52:53

标签: c sockets tcp fork pipe

在作为TCP服务器程序的fork()'部分时,我需要帮助使父母和子进程相互通信。让我们调用TCP服务器的父A和子B,A从客户端接收数据,B自动向该客户端发送数据。当A收到“hi”时,B应该说“你好”。问题是,pipe()似乎不起作用,A需要告诉B客户端发送了需要回复的内容。我已经阅读了有关共享内存的信息,但它对我的使用似乎并不实用。

请提供一些有关如何实施此方法的建议。我能够从TCP套接字的两端发送用户提示的消息,我无法让客户端自动回复。

由于某些原因,我无法完整披露整个代码。以下是一些:

主:

int fd[2];
char bufout[10];
char bufin[10];
if (pipe2(fd,O_NONBLOCK) < 0) puts("Warning: Pipes not Running");

int id = fork();
if (id == -1) {
    perror("fork: ");
    return 1;
}

父:

printf("Client %s connected. \n",cli_ip);     
        while(1){
            memset(mesg,0,sizeof(mesg));
            if( recvfrom(connfd,mesg,sizeof(mesg),0,(struct sockaddr *)&cliaddr,&len) > 0 ){

                    printf("From %s port %d: %s",cli_ip,ntohs(cliaddr.sin_port),mesg);
                    if (strncmp(mesg,"hi",4) == 0) {
                        printf("%s hi you\n",cli_ip);
                        close(fd[0]);
                        write(fd[1],"hi",sizeof("hi"));

                    }
            }
            else {
                    printf("Client %s disconnected. \n",cli_ip);      
                    break;
            }
        }

子:

while (1){
        close(fd[1]);
        if (read(fd[0],bufin,sizeof(bufin))) sendto(sockfd,"hello\r",strlen("hello\r"),0,(const struct sockaddr *)&servaddr,len);

        strcpy(bufin,"");

    }

好吧,“管道未运行”消息没有显示,这是给定的。而且我觉得这是因为有些东西在途中受阻。

2 个答案:

答案 0 :(得分:0)

您可以在C中实现基于UDP的基本消息传递机制(确保它在单独的线程中运行)。那个时候,当A发生某些事情时,B可以通过数据报通知。与B.同样。

答案 1 :(得分:0)

您可以创建环回套接字并将其用于IPC。 Here是一个很好的参考。