0

以前にこの質問をしましたが、解決策がありませんでした (まだ問題があります)。関数がエラーなしで返され、データが送信されなかったため、困惑しています! このコードは Linux で動作します... VxWorks バージョンは動作しません (sendto は送信しませんが、エラーなしで返されます)。

概要 - 私は単純なエコー サーバーを書いています - サーバーは (x86 ボックスから) データを正常に受信し、正常に送信したと主張します。ただし、クライアント (x86 上の netcat) ではデータが受信されません。このコードは、PowerPC ボックスの VxWorks 5.4 で実行されています...

  • UDP データは何らかの方法でバッファリングされていますか?

  • 別のタスクが sendto の送信を妨げている可能性はありますか? (ここで暴走するつもりはありませんが、通常の優先度でアプリケーションをタスク生成します。つまり、ネットワーク タスクなどのような重要なタスクの下にあるため、これで問題ありません)。

  • VxWorks が UDP データをバッファリングしている可能性はありますか?

  • ルーティング テーブルをセットアップしました ... ping が機能します。

  • 私の知る限り、ファイアウォールはありません...

  • sendto のニュアンスと、データがクライアントに到達するのを妨げるものは何ですか...

    while(1)
    {
    readlen = recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr *) &client_address, &slen);

    if (readlen == ERROR)
    {
        printf("RECVFROM FAILED()/n");
        return (ERROR);
    }

    printf("Received %d bytes FROM %s:%d\nData: %s\n\n",
           readlen, inet_ntoa(client_address.sin_addr),
    ntohs(client_address.sin_port), buf);

    // Send it to right back to the client using the open UDP socket
    // but send it to OUTPORT
    client_address.sin_port = htons(OUTPORT);

    // Remember slen is a value (not an address ... in, NOT in-out)
    sendlen = sendto(sock, buf, BUFLEN, 0, (struct sockaddr*)&client_address, slen);

    // more code ....
   }
4

1 に答える 1

1

I trustERRORは と定義されてい-1ますね。sendto(2)では、呼び出しの戻り値を確認していますか? errno(3)価値はどうですか?

コードに見られる明らかな問題の 1 つBUFLENは、送信するメッセージの長さを指定することですが、実際には、readlen受信したバイト数を指定する必要があります。

于 2010-10-19T03:14:42.320 に答える