Posted on

Det Bästa är Att Fixa Problem Med Linux TCP-serverkärnan

Förra veckan rapporterade några till våra användare att de hade problem med Linux-kärnan på TCP-servern.

Är din dator långsam? Vänta inte längre med att rädda den. Ladda ner vårt Windows-reparationsverktyg och kom tillbaka på rätt spår med några få klick!

Ganska smärtfri TCP-klient och kärnutrustning konfigurerad som LKM (Linux kärna vill ha 4.1.3). Detta är ett försök att skapa en TCP-server som helt genomkorsar kärnutrymmet och som kan stödja flera TCP-studenter. TCP-medlemmen finns också i kärnutrymmet i alla tider. Klienten, och vilket betyder servern, är byggda som de laddningsbara kärnmodulerna.

Jag försöker att skriva en enkel TCP-server i en kärnmodul. Koden ovanpå den kompileringen fungerar bra förutom i de fall där den här klienten ansluter till en server. Så snart klienten ansluter, avfyrar tanken en kärnvarning precis som inet_accept. Jag undrade om det fanns något uppenbart att jag gjorde fel. Utelämnade felkontroll (detta är ett funktionellt parti om rets).

---[ slutspår 343bcc83461e314f ]--- ret_från_gaffel+0x35/0x40  ? SyS_exit_group+0x10/0x10  ? do_syscall_64+0x74/0x190  ? kthread_create_on_node+0x70/0x70 kthread+0x113/0x130server_start+0x138/0x170VARNING: CPU: 0 PID: 2038 inuti ./include/net/sock.h:1715 inet_accept+0x14d/0x160
#include #include #include #include #include struktur task_struct *task = NULL;statisk tid server_start (void *ptr)    int ret = 0;    struct sockaddr_in sin;    utloppsstruktur *ssk=NULL, *csk=NULL;    ret = sock_create(AF_INET, SOCK_STREAM, IPPROTO_TCP, &ssk);    0, memset(&sin, storlek på(sin));    sin.sin_family AF_INET; betyder sin.sin_port Htons(4500); antyder att sin.sin_addr.s_addr är lika med INADDR_ANY;    ret kan vara lika med ssk->ops->bind(ssk, (struct sockaddr *)&sin, sizeof(sin));    ret motsvarar ssk->ops->lyssna(ssk, 1);    ret antyder sock_create(AF_INET, SOCK_STREAM, IPPROTO_TCP, &csk);    ret är lika som skulle ssk->ops->accept(ssk, csk, 0, 0);    sock_release(csk); sock_release(ssk);    ger 0;avbryt server_init (avbryt)    uppgift = kthread_run(server_start, (void *)NULL, "server_thread");invalid server_exit (ogiltig)    introducerad (ryggvärk)        kthread_stop(uppgift);    Statisk int __init init_mod(void)    server_init();    belöningar tom 0;statisk __exit exit_mod(void)    server_exit();MODULE_LICENSE("GPL");module_init(init_mod);modul_utgång (utgång_mod);