6

私はCプログラミングの専門家ではありませんが、sendmsg()とrecvmsg()を使用して、クライアントとサーバー間でメッセージを送信する非常に単純なプログラムを作成しようとしています(どちらも同じマシン上にあるため、基本的にはlocalhostにメッセージを送信しています)。

(iovecやmsghdrのように)必要な構造を初期化し、クライアントをサーバーに正常に接続した後、sendmsg()呼び出しは、「使用可能なバッファースペースがありません」というerrn​​oで失敗します。

これは、Linuxの人がこのタイプのエラーについて報告するものです。

ネットワークインターフェイスの出力キューがいっぱいでした。これは通常、インターフェイスが送信を停止したことを示していますが、一時的な輻輳が原因である可能性があります。(通常、これはLinuxでは発生しません。デバイスキューがオーバーフローすると、パケットはサイレントにドロップされます。)

インターネットを調べた結果、sendmsg()が広く使用されておらず、このタイプのエラーに誰も関係がないことがわかりました。私が見つけた唯一の有用なアドバイスは、開いているソケットが過剰になっている可能性を確認することでしたが、ここでも、作成するすべてのソケットを常に閉じます。

だから私は立ち往生しています。基本的には、この種の問題を解決するためにどこを見ればよいのか正確にはわからないためです。

誰かが進む方法を知っているなら、それは素晴らしいことです。(そして、sendmsg()を使用しないように言わないでください。私の仕事の全体的な目的は、このシステムコールを理解することであり、自分自身にメッセージを送信することではないからです)

これまでにpastebinで書いたコードは次のとおりです:クライアントサーバー

-解決済み--

どうもありがとうございます。私は問題を解決することができ、私が犯した他の間違いを修正したので、sendmsg()とrecvmsg()が機能するメッセージパッシングの機能コードは次のとおりです:クライアントサーバー

4

3 に答える 3

4

他の人が指摘しているように、 iovlen は 1 でなければなりません。しかし、初期化されていないフィールドにガベージを送信し、syscall が混乱する可能性があるため、フィールドの一部を初期化する前に mh をゼロにする必要があります。また、 msg_name と msg_namelen を設定するのはあまり意味がありません。なぜなら、接続していて、とにかくデータの送信先について考えを変えることができないからです。

これはあなたのクライアントコードで私にとってうまくいくものです:

/* The message header contains parameters for sendmsg.    */
memset(&mh, 0, sizeof(mh));                                                                                                                                                                                                                                                                          
mh.msg_iov = iov;
mh.msg_iovlen = 1;

printf("mh structure initialized \n");
于 2012-10-10T14:16:47.180 に答える
3

このフィールドには、バイト単位のサイズではなく、 iov配列msg_iovlenの要素数が含まれます。

システムは、次の初期化されていないメモリをiov要素として解釈し、使用可能なソケット バッファ スペースよりも大きなパケットで終了したため、データの送信を拒否しました。

于 2012-10-10T14:11:25.943 に答える
2

さて、あなたのコードで私はこれを見つけました:

mh.msg_iovlen = sizeof(iov);

msg_iovlenメンバーを のサイズに設定しstruct iovecます。しかし、ドキュメントには、このフィールドについて次のように書かれています。

size_t msg_iovlen; /* # msg_iov の要素 */

したがって、コードは間違っていsendmsg()ます。実際に初期化するよりも多くの要素を送信することを示しています。

于 2012-10-10T14:13:25.653 に答える