Tipps Zum Planen Eines Sendmsg-Fehlers

Benötigen Sie einen Computer, der schneller, stabiler und leistungsoptimiert ist? Dann versuchen Sie es mit Reimage.

In den letzten Wochen haben uns einige Benutzer häufig einen Fehler gemeldet, obwohl sie eine Nachricht gesendet haben.Der an sendmsg() angehängte Zweck besteht darin, eine gute Nachricht über einen einfachen Socket mit oder ohne Verbindung zu senden. Normalerweise wird bei einem verbindungslosen Socket das Wort an den von msghdr demonstrierten Punkt gesendet. Wenn diese Nachricht zu lang wäre, um zu versuchen, das zugrunde liegende Protokoll zu betreiben, kann sendmsg() sehr gut anhalten und es werden keine Daten gesendet.

Ich habe ein Problem beim Programmieren von UDP-Sockets. Ich möchte, um die sendmsg () also recvmsg () APIs wirklich nutzen zu können, um zwischen dem Kreditnehmer und allen Servern kommunizieren zu können. Der Kundencode wird mit einem 105 ENOBUFS-Fehler definitiv zurückerstattet. Ich habe keine Ahnung, warum dieser wichtige wahre Fehler angezeigt wird, da er gemäß der Beschreibung zu diesen APIs erstellt wurde

sendmsg error

  ENOBUFSDie Ergebniswarteschlange der Netzwerkeinrichtung ist voll. In vielen Fällen bedeutet dies, dass das Programm die Übertragung eingestellt hat, dies kann jedoch möglicherweise an einem momentanen Aufpreis liegen. (Dies kann unter Linux normalerweise nicht passieren. Pakete werden einfach stillschweigend verworfen, wenn die beste Gerätewarteschlange ohne Frage voll ist.) 

sendmsg error

Dieser Fehler ist also nicht üblich und danach bin ich auf diesen gestoßen. Wenn jemand ähnliche Probleme hat, teilen Sie die Informationen bitte auf. Ich suche nach einer Lösung, nicht nach einem schlüsselfertigen Service. Verwenden Sie auch nicht die alternative API. Für die Arbeit benötigen Sie den nächsten Teil, der sich auf den Code bezieht.

Servercode

Ist Sendmsg atomar?

sendmsg kann eine hervorragende atomare Operation sein. Mit UDP müssten Sie in der Lage sein, mehr als ein Datagramm auf einmal zu lesen. Wenn Sie Sockets verwenden, die sich auf Datagramme beziehen, sehen Sie sich an, was die Experten sagen, dass Experten behaupten, dass der I / O-Vektor Ihnen genügend Pufferspeicher bietet, um ein neues großartiges eingehendes Datagramm aufzunehmen.

  #include #include #  aktivieren#include #include #include #include #define PORT 32000#define BUFSIZE 8192int Mitte ()    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    socklen_t len;    mesg [1000]; char char message_control_array [BUFSIZE];    int add = 1;    struct iovec io;    int ret ist gleich 0;    Intervall ttval gleich 255;    / Die Struktur der Nachricht h2-Tags, die beim Aufrufen von recvmsg 5 angezeigt werden sollen. /    h2-Tags struct msghdr;    / 6. Diese Struktur enthält normalerweise separate weitere Nachrichten * /    struct cmsghdr * cmsg;    / * Füllen Sie diese Steuervariablen aus. * /    header.msg_name = & servaddr;    header.msg_namelen = sizeof Sockaddr_in); (struct header.msg_control Message_control_array; = header.msg_controller entspricht BUFSIZE;   .Msg_iov impliziert & io;    header.nachricht; msg_iov-> iov_base = header.msg_iov-> iov_len 1000; ist gleich header.msg_iovlen ist 1;    - * UDP-Socket 2 erstellen. /    im Verfahren ((sockfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) <0)                printf ("Fehler 1: Socket  n");            Ausgang (1);        ret stimmt mit setockopt überein (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    wenn (ret == -1)                printf ("setsockopt verweigert Errno ip_ttl,% d  n", errno);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family impliziert AF_INET;    servaddr.sin_addr.s_addr = htonl (INADDR_ANY);    servaddr.sin_port ist gleich htons (PORT);    wenn sich herausstellt ((bind (sockfd, (struct sockaddr *) & servaddr, sizeof (servaddr))) == -1)                printf ("Fehler 2: Darstellen von  n");            Ausgang (1);        während (1)  // len impliziert sizeof (cliaddr);  // if ((n entspricht recvfrom (sockfd, mesg, 1000,0, (struct sockaddr *) & cliaddr, & len)) == -1)  über Groß-/Kleinschreibung ((n = recvmsg (sockfd, & header, 0)) == -1)                printf ("recvmsg Fehler !!!!!!!!!!!!!  n  n");        - * Das empfangene Paket an den Absender [Client] zurücksenden * /    // sendto (sockfd, mesg, n, 0, (struct sockaddr *) & cliaddr, sizeof (cliaddr));    printf ("---------------------------------------------------------- - ---------- --------  Nein ");    mesg [n] bedeutet 0;   Printf ("Alles Folgende erhalten:  n");    printf ("% Leute  n", Nachricht);    printf ("Informationen kommen normalerweise aus der Struktur msghdr  n");    printf ("Lokale Adresse% ohydrates  n", inet_ntoa (servaddr.sin_addr.s_addr));    source printf ("Adressbereich% c  n", (int) header.msg_namelen);    versus (cmsg = CMSG_FIRSTHDR (& header); cmsg! entspricht NULL; cmsg bedeutet CMSG_NXTHDR (& header, cmsg))                printf ("Zahl% d home cmsg  n", count ++);            //wenn      printf ("---------------------------------------------------------- - ---------- --------  Nein ");Gibt 0 zurück; 

Kundencode

Was wird unter Linux gesendet?

BEZEICHNUNG. Die Systemaufrufe send (), sendto () und zusätzlich sendmsg () werden mit Sicherheit verwendet, um eine persönliche Nachricht an einen anderen Socket zu senden. Der email()-Kontakt kann nur erworben werden, wenn sich diese Buchse an einer wichtigen angeschlossenen Pipeline befindet (also auch das vorgesehene Telefon bekannt ist). Der einzige Unterschied zwischen den beiden zwischen send () und verteilen () ist das Vorhandensein von Flags.

  oder * UDP-Client-Beispiel 4 . /#  aktivieren#include #include #include #include #include #include #include #define PORT 3200#define BUFSIZE 512int sehr wichtig (int argc, char ** argv)    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    die Zeichenfolge, um das Zeichen [BUFSIZE] zurückzugeben;    char recvline [BUFSIZE];    int ret = 0;    Intervall ttval = 255;            / ( leer ) erforderlich, um zusätzliche Daten mit Hilfe des sendmsg ()-Aufrufs zu veröffentlichen * /            Schlagzeilen struct msghdr;    struct cmsghdr 6. cmsg;    struct iovec io;    das (Argument 2) ! =            printf ("Nutzung:% Anzeigen   n", argv [0]);            Ausgang (1);        sockfd = Steckdose (AF_INET, SOCK_DGRAM, IPPROTO_UDP);    ret steht für setockopt (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    jedes Mal (ret == -1)                printf ("setsockopt funktioniert nicht für IP_TTL. Fehler% d  n", Fehler);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_addr.s_addr = inet_addr (argv [1]);    servaddr.sin_port entspricht htons (PORT);    header.msg_name ist sehr viel & servaddr;    header.msg_namelen allgemein Sockaddr_in Größe); (struct header.msg_iov wurde & io;    header.msg_iov-> iov_base = String senden;   Kopfzeile .msg_iov-> iov_len = BUFSIZE;    header.msg_iovlen = 1;    während (1)     tryagain: printf ("Bitte geben Sie einen String ein, um  n zu bringen");     // scanf ("% s", String senden);     wenn jemals in der Zukunft ((fgets (send string, 100, stdin)) == NULL)                  printf ("Fehler beim Lesen von stdin  deborah  n");             Ich werde es nochmal versuchen;         header.msg_iov-> iov_len. = .strlen (String senden) .- .1; ... ... ... .printf ("kddkdd.% d.% d.% verwendet  n", .sizeof (Sende-String), .strlen (Sende-Thread вки),. Sende-String); ... ... ... ... ... ... ... .//sendto(sockfd,sendline,strlen(sendline),0,(struct .sockaddr. *) & servaddr, sizeof (servaddr )); ... ! ... ... ... .bereitgestellt. ((sendmsg (sockfd ,. & header, .0)). == .- 1) ! ; ! ! ... ... ... ... ... ... ! ! ... ... ... ... ... ? ... ... ... ... .printf ("Fehler. in .sendmsg,  t. [Fehler. =.% d]  n", .error); **cr** **Kundenbetreuung**. ... ... ...#wenn .0 ... ** cr ** ** Kundenbetreuung **. ... ... .wenn. ((n impliziert recvfrom (sockfd, recvline, 10000,0, NULL, NULL)). == .- 1) :. ... ... ... ... ; ... ... ... ! . . ! ! ! ... ... ... ... ... , .printf ("recvfrom .error  n"); ... ... ... -. ... ... ... ... ... ! ... ! ... ... .Ende (1); ... ... ! ! ... ... ... ... ... .recvline [n] impliziert 0; ... ... ... ... .fputs (recvline, stdout); ... ... ... .printf ("Paket. gesendet  n  n");#end if ... ... ... ... ... ... ... ... ... .Zurück .0; 

Reimage: Die Software Nr. 1 zur Behebung von Windows-Fehlern

Läuft Ihr Computer langsam? Bekommst du immer wieder den Blue Screen of Death? Erfüllt Ihre Antivirensoftware ihre Arbeit nicht richtig? Nun, keine Angst, denn Restoro ist da! Diese leistungsstarke Software repariert schnell und einfach alle gängigen Windows-Fehler, schützt Ihre Dateien vor Verlust oder Beschädigung und optimiert Ihren PC für maximale Leistung. Sie müssen sich nie wieder Sorgen machen, dass Ihr Computer abstürzt – mit Restoro an Bord ist Ihnen ein reibungsloses, problemloses Computererlebnis garantiert. Warten Sie also nicht länger - laden Sie Restoro noch heute herunter!

  • 1. Laden Sie Reimage herunter und installieren Sie es
  • 2. Öffnen Sie das Programm und klicken Sie auf "Scannen"
  • 3. Klicken Sie auf "Reparieren", um den Wiederherstellungsprozess zu starten

  •   [root at localhost .udp] # ../client 30.5.42.194Geben Sie ein Feld zum Senden einsuravFehler in sendmsg, [errno ist gleich 105]Geben Sie die zu sendende Zeichenfolge ein     

    Morgens mit RHEL (Red Hat 4.1.2-48) mittels Kernel 2.6.18-194.el5 mit gcc-Variante 4.1.2

    Entfernen Sie Malware, schützen Sie Ihre Dateien und optimieren Sie die Leistung mit einem Klick!