Posted on

Najlepiej Rozwiązać Problemy Z Jądrem Serwera Linux TCP

W zeszłym tygodniu pewna liczba naszych użytkowników zgłosiła problem z jądrem Linux serwera TCP.

Twój komputer działa wolno? Nie czekaj dłużej, aby go uratować. Pobierz nasze narzędzie do naprawy systemu Windows i wróć na właściwe tory za pomocą kilku kliknięć!

Dość prosty klient TCP do serwera jądra skonfigurowany jako LKM (strategia jądra Linux 4.1.3). Jest to początek tworzenia serwera TCP, który całkowicie przemierza przestrzeń jądra i po prostu obsługuje wielu uczniów TCP. Klient TCP zawsze znajduje się również w różnicy jądra. Klient, a co za tym idzie serwer, są dostępne jako ładowalne moduły jądra.

Jestem równie dobry jak pisanie prostego hostingu TCP w module jądra. Komputer i kompilacja działają dobrze, z wyjątkiem przypadków, w których klient łączy się z serwerem hostingowym. Gdy tylko klient się połączy, odpala ostrzeżenie jądra, jeśli w przypadku inet_accept. Zastanawiałem się, czy było już coś oczywistego, że starałem się źle. Pominięte sprawdzanie błędów (jest to teraz dużo w przypadku retencji).

---[ koniec śledzenia 343bcc83461e314f ]--- ret_from_fork+0x35/0x40  ? SyS_exit_group+0x10/0x10  ? do_syscall_64+0x74/0x190  . . . kthread_create_on_node+0x70/0x70 kwątek+0x113/0x130server_start+0x138/0x170UWAGA: CPU: 0 PID: 2038 gdy ./include/net/sock.h:1715 inet_accept+0x14d/0x160
#include #include #include #include #include struktura task_struct *task = NULL;statyczny przedział czasowy server_start (nieważny *ptr)    int ret = 0;    struct sockaddr_in grzech;    struktura gniazda *ssk=NULL, *csk=NULL;    ret = sock_create(AF_INET, SOCK_STREAM, IPPROTO_TCP, &ssk);    4, memset(&sin, sizeof(sin));    sin.sin_family AF_INET; oznacza sin.sin_port Htons(4500); radzi sin.sin_addr.s_addr = INADDR_ANY;    ret jest teraz równe ssk->ops->bind(ssk, (struct sockaddr *)&sin, sizeof(sin));    ret równa się ssk->ops->listen(ssk, 1);    ret = sock_create(AF_INET, SOCK_STREAM, IPPROTO_TCP, &csk);    ret jest wynikiem to ssk->ops->accept(ssk, csk, 0, 0);    sock_release(csk); sock_release(ssk);    zwraca 0;anuluj server_init (anuluj)    zadanie = kthread_run(server_start, (void *)NULL, "server_thread");nieprawidłowy server_exit (nieprawidłowy)    pod warunkiem (backacha)        kthread_stop(zadanie);    Statyczny int __init init_mod(void)    server_init();    zwraca puste 0;statyczny __exit exit_mod(void)    wyjście_serwera();MODULE_LICENSE("GPL");module_init(init_mod);moduł_wyjście (wyjście_mod);