Registre algunos problemas encontrados en la programación de red

Directorio de artículos

EPOLL

Hoy en día, debido epollal modo de ET se pierde connect事件, sin cerebro puesta al día sólo para encontrar un error en el cual, se hace constar.

Cuando solo se utiliza el modo ET de epoll, múltiples cennectsolo pueden activar uno 事件, por lo que es necesario realizar un bucle accepthasta que regrese -1y errorse establezca WAGAINo WEOULDBLOCKno salga del bucle. De lo contrario lo hará 丢失connect事件.

La diferencia entre LT LT y ET
LT de Epoll : disparador horizontal, la eficiencia será menor que la del disparador ET, especialmente en el caso de gran concurrencia y gran flujo. Sin embargo, LT tiene requisitos relativamente bajos para la escritura de código y no es propenso a problemas. El rendimiento de la escritura del servicio en modo LT es: mientras haya datos que no se hayan obtenido, el núcleo continuará notificándole, por lo que no hay necesidad de preocuparse por la pérdida del evento.
ET: La activación de borde es muy eficiente. En el caso de tráfico concurrente y grande, habrá muchas menos llamadas al sistema epoll que LT, por lo que la eficiencia es alta. Sin embargo, los requisitos para la programación son altos y cada solicitud debe manejarse con cuidado, de lo contrario, puede ocurrir fácilmente un evento de pérdida.
El siguiente es un ejemplo para ilustrar la diferencia entre LT y ET (ambos son modos sin bloqueo, no se dice bloqueo, la eficiencia es demasiado baja):
en modo LT, si la llamada de aceptación regresa, puede establecer inmediatamente la conexión actual y luego esperar epoll_wait El siguiente aviso es el mismo que select.
Pero para ET, si la llamada accpet regresa, además de establecer la conexión actual, epoll_wait no puede continuar inmediatamente haciendo un loop hasta que devuelve -1, y errno == EAGAIN

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);
    }
} 

Dos funciones

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
depura el programa multiproceso
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

Otros

Con respecto a switchun pequeño problema, casedebe usar llaves para cada uno . Raramente he usado este problema antes. Puedo consultarlo aquí: https://stackoverflow.com/questions/5685471/error-jump-to-case-label

74 artículos originales publicados · Me gusta 11 · Visitas 30,000+

Supongo que te gusta

Origin blog.csdn.net/yijiull/article/details/90271094
Recomendado
Clasificación