1

質問をする前に、私はネットワーク プログラミングの分野では初心者であることをお知らせします。間違いをお許しいただき、改善方法を提案してください。前もって感謝します!

私のネットワーク プログラミング クラスの課題で、教授は fork() を使用するクライアント プログラムを作成するように求めています。

pid = fork();
if (pid == 0) // child
Send();
else //parent
Recv();

そして、私が試みているコードは次のとおりです。

#include <cstdlib>
#include <stdio.h>
#include <error.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define SERVER_PORT_NUM "10060"
#define MAX_BYTES 2000
using namespace std;

int main(int argc, char** argv) {

int status;
struct addrinfo hints;
struct addrinfo *servinfo;
char buf[MAX_BYTES];

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;

if ( (status = getaddrinfo("localhost", SERVER_PORT_NUM, &hints, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
return 2;
}

int s;
if ((s = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == -1) {
    fprintf(stderr, "socket: %s\n", gai_strerror(s));
    return 2;
}

if (connect(s, servinfo->ai_addr, servinfo->ai_addrlen) == -1) {
    close(s);
}

freeaddrinfo(servinfo);

char ch='\0';
pid_t pid = fork();
if (pid == 0) {// child process
    while(1){
        memset(&buf, 0, sizeof(buf));
        scanf("%s",buf);
        send(s,buf,strlen(buf),0);

    }

}//pid==0

else { //parent process
    int numbytes=0;
    memset(&buf, 0, sizeof(buf));
    while(1) {
        if((numbytes= recv(s, &buf, MAX_BYTES-1, 0)) >0) {
        printf("\n%s", buf);
        memset(&buf, 0, numbytes);
        }

        if(numbytes < 0) {
            printf("Error receiving data");
        }

    }

}

close(s);
return 0;
}

クライアント端末でユーザーからの入力がある場合にのみサーバーにデータを送信し、サーバーからのデータがある場合はクライアント端末に表示したい。現在、サーバーから一度データを取得した後、ハングしています。サーバーとの間でデータの送受信を終了するための最良の条件は何ですか?

4

1 に答える 1

0

読み取り後にのみ書き込みが行われるようにする部分については、使用する方法の 1 つです。

wait(NULL);

親が子プロセスの終了を待機するために使用する呼び出しです。この後に実行されるコードはすべて、子が終了した後に実行されることが保証されます。

おそらく、順序を逆にする必要があります。つまり、親が書き込みを行い、子供が読み取りを行う必要があります。

ただし、これは、クライアントが読み取りを完了して終了した後にすべての書き込みが行われることを意味します。

完全な 1 行を読みたい場合は、書き込んで再度読み直すという上記の方法は適していません。

于 2012-10-02T12:23:10.647 に答える