1

私はUnix、Cの割り当てを行っています。相互に対話するサーバーとクライアントを作成しています。基本的なフレームワークをセットアップしたと確信していますが、メッセージを送受信しようとすると機能しません。

これはサーバーのwhileループコードです。関連するコードのみを表示しようとしました:

while(1) {
            clntAdrLen = sizeof(clntAddr);
            clntFd = accept(srvrFd, (struct sockaddr*)&clntAddr, NULL);
            if (fork() == 0) { 
                    send(clntFd, "YourMessage", 12, NULL);
                    close(clntFd);
                    exit(0);
            } else {
                    close(clntFd);
            }
}

クライアントのコードは次のとおりです。

do {
            result = connect(srvrFd, (struct sockaddr*)&srvrAddr, srvrLen);
            if(result==-1) {
                    sleep(1);
            }
            recv(srvrFd, buf, sizeof(buf), NULL);
            printf("%s", buf); //here I try to print the message sent by server
    } while (result==1);

サーバーとクライアントの両方を実行すると、「YourMessage」が出力されます。代わりに、次のように出力します。

N0�,

私はそれを間違っているだけですか?ありがとう

4

2 に答える 2

1

あなたの問題は受け入れ機能にあると思います。

Linux Programmer's Manual で述べたように:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

addrlen 引数は、値と結果の引数です。呼び出し元は、addr が指す構造体のサイズ (バイト単位) を含むように初期化する必要があります。返されると、ピア アドレスの実際のサイズが含まれます。

于 2013-05-20T03:50:48.883 に答える
-1

「UNIX Network Programming」 ISBN-10: 0139498761

ソケット プログラミングには、目に見える以上の方法があります。

1 つには、送信された文字列の長さを受信側でどのように知るのでしょうか? 常に 12 であると仮定しますか? ほとんどの実際の例では、毎回同じになるわけではありません。

文字列の末尾に到達するまで読み取りますか、それとも先頭で整数を送信してリーダーに長さを伝えますか?

整数を使用する場合、エンディアンについて知っていますか?

私たちがあなたのために宿題をしたら、あなたは本当に何かを学ぶつもりですか? おそらくあなたは大学にいて、授業料を払っています。あなたは合格するためにそこにいますか、それとも学ぶためにそこにいますか?

于 2013-05-20T03:46:42.293 に答える