ネットワークプログラミングで発生したいくつかの問題を記録する

記事ディレクトリ

EPOLL

以下のために今日は、ETモードが失われ、その日の試運転無脳は、それがここに記録され、中にエラーを見つけることにします。epollconnect事件

epollのETモードのみを使用する場合、複数cennectがトリガーする可能性事件があるのは1つだけなので、ループacceptが返され-1ループにerror設定されるWAGAINWEOULDBLOCK、ループを終了しないまでループする必要があります。それ以外の場合は丢失connect事件

epollのLTとET
LT の違い:水平トリガー、効率はETトリガーよりも低くなります(特に、同時実行数が多くフローが大きい場合)。ただし、LTにはコード作成の要件が比較的低く、問題が発生する傾向はありません。LTモードサービス書き込みのパフォーマンスは次のとおりです。取得されていないデータがある限り、カーネルは引き続き通知するので、イベントの損失について心配する必要はありません。
ET:エッジトリガーは非常に効率的であり、同時および大量のトラフィックの場合、LTよりはるかに少ないepollシステムコールがあるため、効率は高くなります。ただし、プログラミングの要件は高く、各要求は慎重に処理する必要があります。そうしないと、損失イベントが発生しやすくなります。
以下は、LTとETの違いを示す例です(両方とも非ブロッキングモードであり、ブロッキングは言われず、効率が低すぎます)
。LTモードでは、受け入れ呼び出しが返された場合、現在の接続をすぐに確立してから、epoll_waitを待機できます。次の通知はselectと同じです。
ただし、ETの場合、accpet呼び出しが戻ると、現在の接続の確立に加えて、epoll_waitは、-1を返し、errno == EAGAINを返すまですぐにaccpetをループし続けることはできません。

while(1)
{
    struct sockaddr_in client_address;
    socklen_t len = sizeof client_address;
    int connfd = accept(listenfd, (struct sockaddr*)&client_address, &len);
    if(connfd == -1)
    {
        if(errno == EAGAIN || errno == EWOULDBLOCK)
        {
            break;
        }
    }
    else
    {
        addfd(epollfd, connfd, true);
    }
} 

2つの機能

https://www.quora.com/What-is-the-main-difference-between-copy_file_range-and-sendfile-system-calls-in-Linux


sendfile();
copy_file_range(); 
以上两个函数输入必须是可以映射到内存的文件,输出sendfile()必须是套接字,copy_file_range()没有限制。

GDB

// TODO
デバッグマルチスレッドプログラム
http://logan.tw/posts/2015/11/01/debug-multithreaded-program-with-gdb/

https://cboard.cprogramming.com/c-programming/149636-multi-thread-share-global-variable-problems.html

その他の

switch小さな問題については、ごとにcase中括弧を使用する必要があります。これまでこの問題を使用したことはほとんどありません。ここで参照できます:https : //stackoverflow.com/questions/5685471/error-jump-to-case-label

74件のオリジナル記事を公開 11のよう 30,000以上の訪問

おすすめ

転載: blog.csdn.net/yijiull/article/details/90271094