Wskazówki, Które Pomogą Ci Naprawić Błąd Sendmsg

Potrzebujesz komputera, który jest szybszy, stabilniejszy i zoptymalizowany pod kątem wydajności? Następnie wypróbuj Reimage.

W ciągu ostatnich kilku tygodni niewielka liczba użytkowników zgłosiła nam błąd podczas przesyłania wiadomości.Celem sendmsg() jest wysyłanie wiadomości przez szybkie gniazdo z połączeniem lub bez. Zazwyczaj, gdy s jest wtyczką bezpołączeniową, wiadomość jest wysyłana do punktu wskazanego przez msghdr. Jeśli dana wiadomość jest zbyt długa, aby myśleć o użyciu podstawowego protokołu, sendmsg() zatrzyma się i nie zostaną wysłane żadne pliki danych.

Mam problem z programowaniem gniazd UDP. Chcę użyć API sendmsg() i dodatkowo recvmsg(), aby móc lepiej komunikować się między kupującym a serwerem. Kod dostępu klienta jest zwracany definitywnie ze stu pięćdziesięcioma błędami ENOBUFS. Nie wyobrażam sobie, dlaczego pokazuje ten poważny błąd merytoryczny, ponieważ zgodnie z każdym opisem tych interfejsów API jest on bez wątpienia napisany

błąd wysyłania wiadomości

  ENOBUFSKolejka wyników systemu sieciowego jest pełna. W większości przypadków oznacza to, że interfejs przestał nadawać, ale może to być spowodowane chwilowym przeciążeniem. (Zazwyczaj nie można tego zrobić w systemie Linux. Pakiety są po prostu zrzucane po cichu, gdy najlepsza linia urządzeń jest pełna.) 

sendmsg error

Więc ten błąd nie jest powszechny i ​​natknąłem się na ten cenny. Jeśli ktoś ma podobne niepowodzenia, prosimy o udostępnienie informacji. Szukam rozwiązania, a nie rozwiązania pod klucz. Nie używaj również alternatywnego API. Forwork możesz potrzebować następnej części związanej z kodem osoby.

Kod serwera

Czy Sendmsg jest atomowe?

sendmsg może być operacją atomową. Dzięki UDP powinieneś być w stanie wysłać artykuł więcej niż jeden datagram w dowolnym czasie. Jeśli używasz gniazdek elektrycznych do datagramów, zobacz, co mówią lekarze, że wektor I / O ma wystarczająco dużo miejsca w buforze, aby pomóc Ci przechowywać świetny przychodzący datagram.

  #include #include # włącz #include #include #include #włącz #definiuj PORT 32000#define BUFSIZE 8192wew główna ()    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    socklen_t len;    wiadomość [1000]; char char message_control_array [rozmiar_buforu];    int dodaj oznacza 1;    struct iovec io;    int ret równa się 0;    ttwart procesu = 255;    per * Struktura nagłówka tych wiadomości do wyświetlenia podczas rozmowy z recvmsg * /    tagi h2 struct msghdr;    oraz * Ta struktura zazwyczaj oferuje oddzielne dodatkowe komunikaty * /    struct cmsghdr 6 . cmsg;    / * Wypełnij zmienne podatkowe. 4 . /    header.msg_name równa się & servaddr;    header.msg_namelen oznacza rozmiar Sockaddr_in); (struct header.msg_control Message_control_array; równa się header.msg_controller = ROZMIAR BUFS;   .Msg_iov = & io;    nagłówek.wiadomość; msg_iov-> iov_base = nagłówek.msg_iov-> iov_len 1000; = header.msg_iovlen wynosi 1;    / * Utwórz gniazdo UDP * /    w przypadku ((sockfd = outlet (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) <0)                printf ("Błąd 1: gniazdo  n");            Wyjście (1);        ret dopasowuje setsockopt (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    jeśli (ret == -1)                printf ("setsockopt zaprzecza Errno ip_ttl,% d  n", errno);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family oznacza AF_INET;    servaddr.sin_addr.s_addr jest równy htonl (INADDR_ANY);    servaddr.sin_port równa się htonom (PORT);    gdzie ((bind (sockfd, (struct sockaddr *) & servaddr, sizeof (servaddr))) == -1)                printf ("Błąd trzeci: wiązanie  n");            Wyjście (1);        w wyniku (1)  // len oznaczałaby sizeof (cliaddr);  // if ((n obsługuje recvfrom (sockfd, mesg, 1000,0, (struct sockaddr *) & cliaddr, & len)) == -1)  w przypadku ((n równa się recvmsg (sockfd i nagłówek, 0)) == -1)                printf ("recvmsg pomyłkę !!!!!!!!!!!!!  n  n");        / * Zwróć prezentowany pakiet do nadawcy [klient] ( puste ) /    // sendto (sockfd, mesg, n, 0, (struct sockaddr *) & cliaddr, sizeof (cliaddr));    printf ("---------------------------------------------------------- od ---------- --------  Nie ");    komunikat [n] oznacza 0;   Printf ("Pobierz zwykle wszystkie następujące:  n");    printf ("% s  n", wiadomość);    printf ("Informacje zwykle pochodzą ze struktury msghdr  n");    printf („Adres lokalny% s  n”, inet_ntoa (servaddr.sin_addr.s_addr));    source printf („Zakres adresów% d  n”, (int) header.msg_namelen);    versus (cmsg równa się CMSG_FIRSTHDR (& nagłówek); cmsg! dopasowuje NULL; cmsg = CMSG_NXTHDR (& nagłówek, cmsg))                printf ("liczba% j struktury cmsg  n", sumuj ++);            //Jeśli      printf ("---------------------------------------------------------- - ---------- --------  Nie ");Zwraca 0; 

Kod klienta

Co to jest poczta w systemie Linux?

PRZEZNACZENIE. Wywołania systemowe throw(), sendto() i sendmsg() są używane do rozgłaszania wiadomości do innego gniazdka. Kontakt send() może być idealnie użyty, jeśli to gniazdo może znajdować się na połączonym rurociągu (więc ten konkretny odbiorca jest również znany). Jedyną różnicą między send() a write() jest obecność powiązana z flagami.

  / * Przykład klienta UDP * /# włącz #include #włącz #include #include #dołącz #włącz #include #definiuj PORT 3200#define BUFSIZE 512int main (int argc, char ** argv)    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    archipelag do wysłania postaci [BUFSIZE];    char recvline [rozmiar_buforu];    int ret jest równe 0;    przedział ttval wynosi 255;             * wymagane do publikacji innych danych za pomocą sendmsg() call /            tagi h2 struct msghdr;    struct cmsghdr * cmsg;    struct iovec io;    gdzie (argument 2) - =            printf ("Użycie:% s   n", argv [0]);            Wyjście (1);        sockfd jest równy socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);    ret oznacza produkcję setockopt (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    w każdej chwili (ret == -1)                printf ("setsockopt nie działa, aby otrzymać IP_TTL. Błąd% d  n", błąd);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_addr.s_addr równa się inet_addr (argv [1]);    servaddr.sin_port implikuje htons (PORT);    header.msg_name to & servaddr;    header.msg_namelen oznacza rozmiar Sockaddr_in); (struct header.msg_iov to & io;    header.msg_iov-> iov_base = wyślij mi string;   Nagłówek .msg_iov-> iov_len oznacza ROZMIAR BUFS;    header.msg_iovlen równa się 1;    przechodzić (1)     tryagain: printf ("Proszę wprowadzić ciąg, aby ściśle wysłać  n");     // scanf ("% s", przynieś ciąg);     w instancji ever ((fgets (send string, 100, stdin)) == NULL)                  printf ("Błąd odczytu stdin  chemiczny  n");             przyjrzę się ponownie;         header.msg_iov-> iov_len. równa się .strlen (wyślij ciąg) .- .1; ... ... ... .printf ("kddkdd.% d.% d.% h  n", .sizeof (wyślij ciąg), .strlen (wyślij ciąg вки),. ciąg poczty); ... ... ... ... ... ... ... .//sendto(sockfd,sendline,strlen(sendline),0,(struct .sockaddr. *) & servaddr, sizeof (servaddr )); ... ! ... ... ... .Jeśli. ((sendmsg (sockfd ,. i nagłówek, .0)). == .- 1) ! * ! ! ... ... ... ... ... ... ! . ... ... ... ... ... ? ! ? ... ... ... ... .printf ("Błąd. z .sendmsg,  t. [Błąd. =.% d]  n", .error); **obsługa klienta** **cr**. ... ... ...#jeśli .0 ... ** cr ** ** obsługa klienta **. ... ... .Jeśli. ((n jest równe recvfrom (sockfd, recvline, 10000,0, NULL, NULL)). == .- 1) :. ... ... ... ... ; ... ... ... ! ! ! - ... ... ... ... ... - - .printf ("recvfrom .error  n"); ... ... ... -. ... ... ... ... ... ! ... ! ... ... .koniec (1); ... ... ! ! ! ! ! ... ... ... ... ... .recvline [n] = 0; ... ... ... ... .fputs (recvline, stdout); ... ... ... .printf ("pakiet. wysłano  m  n");#zakończ, jeśli ... ... ... ... ... ... ... ... ... .Powrót .0; 

Reimage: Oprogramowanie nr 1 do naprawy błędów systemu Windows

Czy Twój komputer działa wolno? Czy wciąż otrzymujesz Blue Screen of Death? Czy Twoje oprogramowanie antywirusowe nie wykonuje poprawnie swojej pracy? Cóż, nie bój się, ponieważ Restoro jest tutaj! To potężne oprogramowanie szybko i łatwo naprawi wszelkiego rodzaju typowe błędy systemu Windows, ochroni pliki przed utratą lub uszkodzeniem oraz zoptymalizuje komputer pod kątem maksymalnej wydajności. Już nigdy nie będziesz musiał się martwić o awarię komputera — dzięki Restoro na pokładzie masz gwarancję płynnego i bezproblemowego korzystania z komputera. Więc nie czekaj dłużej — pobierz Restoro już dziś!

  • 1. Pobierz i zainstaluj Reimage
  • 2. Otwórz program i kliknij „Skanuj”
  • 3. Kliknij „Napraw”, aby rozpocząć proces przywracania

  •   [root - localhost .udp] # ../client 30.5.42.194Wpisz temat do wysłaniasurawaBłąd podczas wysyłania wiadomości, [errno = 105]Wpisz ciąg, aby pomyślnie wysłać     

    Używam RHEL (Red Hat 4.1.2-48) z jądrem 2.6.18-194.el5 zawierającym opcję gcc 4.1.2

    Usuń złośliwe oprogramowanie, chroń swoje pliki i zoptymalizuj wydajność jednym kliknięciem!