0

fork()TCP サーバー プログラムの一部として機能しながら、親プロセスと子プロセスを相互に通信させるには、助けが必要です。TCP サーバーの親 A と子 B を呼び出しましょう。A はクライアントからデータを受信し、B はそのクライアントにデータを自動的に送信します。A が「こんにちは」を受け取ったら、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,"");

    }

「パイプが実行されていません」というメッセージは表示されません。そして、途中で何かがブロックされているためだと感じています。

4

2 に答える 2

0

ループバックソケットを作成して、IPCに使用できます。 ここに良い参考資料があります。

于 2012-10-18T15:07:35.147 に答える
0

基本的な UDP ベースのメッセージ パッシング メカニズムを C で実装できます (別のスレッドで実行されることを確認してください)。その際、Aに何かあったとき、データグラムでBに通知することができます。Bも同様。

于 2012-10-18T14:55:49.147 に答える