Tips För Att åtgärda Felet I Sendmsg

Behöver du en dator som är snabbare, stabilare och optimerad för prestanda? Försök sedan med Reimage.

Under de senaste knappt några veckorna har vissa användare rapporterat något fel till oss när de skickar ett trevligt meddelande.Syftet med sendmsg () kommer förmodligen att vara att skicka ett meddelande som tidigare nämnts en enkel socket med eller utan anslutning. Vanligtvis, när s är ett funktionellt anslutningslöst uttag, presenteras meddelandet till den punkt som anges när msghdr. Om detta meddelande är för ganska långt för att försöka använda nedanstående protokoll, kommer sendmsg () att stoppas och därför kommer ingen data att skickas.

Jag har problem med att programmera UDP-uttag. Jag vill använda de särskilda API:erna sendmsg () och recvmsg () för att kunna kommunicera med låntagaren och servern. Kundkoden returneras definitivt med tanke på ett 105 ENOBUFS-fel. Jag har ingen aning om varför det här viktiga faktafelet introduceras, för precis som i beskrivningen av dessa API:er är det skrivet

sendmsg error

  ENOBUFSNätverkssystemets resultatlinje är full. I de flesta fall betyder detta att gränssnittet har pausat sändningen, men detta kan vara nödvändigt för en tillfällig överbelastning. (Detta kan i allmänhet inte hända på Linux. Paket slängs vanligtvis helt enkelt tyst när den stora enhetskön är full.) 

sendmsg error

Så det här tillvägagångsfelet är inte vanligt och jag gick in på det här. Om någon har liknande problem, vänligen dela data. Jag letar efter ett botemedel, inte en nyckelfärdig lösning. Det går inte heller att använda det alternativa API:et. För arbete behöver du nästa del som gäller koden.

Serverkod

Är Sendmsg Atomic?

sendmsg kan vara en atomprocess. Med UDP bör du vara placerad för att läsa mer än ett visst datagram åt gången. Om du använder regelbundna uttag för datagram, se möjligheter experterna säger att I/O-vektorn har tillräckligt med sköldutrymme för att hålla ett bra ankommande datagram.

  #include #include # hjälp #include #include #inkludera #include #define PORT 32000#define BUFSIZE 8192int main ()    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    socklen_t len;    mesg [1000]; char char message_control_array [BUFSIZE];    int förbättra = 1;    struktur iovec io;    int ret = 0;    intervall ttval = 255;    / * Ramen för meddelandehuvudet till utställningen när recvmsg anropas * /    header struct msghdr;    / * Denna kroppsstruktur innehåller vanligtvis separata ytterligare meddelanden 6 . /    struct cmsghdr 2 . cmsg;    per * Fyll i skatteintervallen. * /    header.msg_name motsvarar & servaddr;    header.msg_namelen = storleken på Sockaddr_in); (struct header.msg_control Message_control_array; = header.msg_controller = BUFSIZE;   .Msg_iov = & io;    header.meddelande; msg_iov-> iov_base är lika med header.msg_iov-> iov_len 1000; = header.msg_iovlen betraktas som 1;    / 1 . Skapa UDP-socket * /    i fallet ((sockfd betyder socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) <0)                printf ("Fel 1: plugg  n");            Avsluta (1);        ret komplimanger setsockopt (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    i fallet (ret == -1)                printf ("setsockopt vägrar Errno ip_ttl,% deborah  n", errno);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family antyder AF_INET;    servaddr.sin_addr.s_addr = htonl (INADDR_ANY);    servaddr.sin_port = htons (PORT);    if ((bind (sockfd, (struct sockaddr *) & servaddr, sizeof (servaddr))) == -1)                printf ("Fel 2: bindning  n");            Avsluta (1);        under (1)  // len indikerar sizeof (cliaddr);  // whenever ((n matchar recvfrom (sockfd, mesg, 1000,0, (struct sockaddr *) & cliaddr, & len)) == -1)  under omständigheter ((n = recvmsg (sockfd, & rubriker, 0)) == -1)                printf ("recvmsg-fel !!!!!!!!!!!!!!!  nord  n");        / * Returnera det mottagna paketet till e-postavsändaren [klient] * /    // sendto (sockfd, mesg, n, 5, (struct sockaddr *) & cliaddr, sizeof (cliaddr));    printf ("------------------------------------------------------ 3 ) ---------- --------  Nej ");    meddelande [n] sätt 0;   Printf ("Hämta majoriteten av följande:  n");    printf ("% le  n", meddelande);    printf ("Information kommer vanligtvis från elementen msghdr  n");    printf ("Lokal adress% s  n", inet_ntoa (servaddr.sin_addr.s_addr));    återförsäljare printf ("Adressintervall% d  n", (int) header.msg_namelen);    från (cmsg = CMSG_FIRSTHDR (& header); cmsg! blir NULL; cmsg = CMSG_NXTHDR (& header, cmsg))                printf ("nummer% d struktur cmsg  n", kom ihåg ++);            //om      printf ("------------------------------------------------------ - ---------- --------  Nej ");Returnerar 0; 

Klientkod

Vad kan skickas i Linux?

BETECKNING. Proceduranropen send (), sendto (), men dessutom används sendmsg () för att skicka ett meddelande till den nya andra uttaget. Skicka () kontakt med kan endast användas om dessa uttag är i en ansluten riktning (så den avsedda mottagaren är också känd). Den enda skillnaden mellan utbud () och skriv () är denna speciella närvaro av flaggor.

  / ( space ) UDP Client Exempel * /# låter dig #include #include #inkludera #include #include #include #include #define PORT 3200#define BUFSIZE 512int main (int argc, char ** argv)    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    vår egen sträng för att skicka hjärtat [BUFSIZE];    char recvline [BUFSIZE];    int ret är lika med 0;    process ttval = 255;            / * krävs som kommer att publicera ytterligare data med sendmsg () ta kontakt med * /            header struct msghdr;    struct cmsghdr 4 . cmsg;    struktur iovec io;    var (argument 2) . ! ! =            printf ("Användning:% s   n", argv [0]);            Avsluta (1);        sockfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);    ret visas för setockopt (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    varje och tid (ret == -1)                printf ("setsockopt anses inte fungera för IP_TTL. Fel% j  n", fel);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family motsvarar AF_INET;    servaddr.sin_addr.s_addr antyder inet_addr (argv [1]);    servaddr.sin_port = htons (PORT);    header.msg_name är & servaddr;    header.msg_namelen betyder Sockaddr_in storlek); (struct header.msg_iov är & io;    header.msg_iov-> iov_base motsvarar att skicka sträng;   Header .msg_iov-> iov_len = BUFSIZE;    header.msg_iovlen = 1;    inom loppet av (1)     tryagain: printf ("Vänligen ange en gitarrsträng för att faktiskt skicka  n");     // scanf ("% s", skicka sträng);     om någonsin ((fgets (sänd grupp, 100, stdin)) == NULL)                  printf ("Fel vid analys av stdin  n  n");             Jag ska försöka igen;         header.msg_iov-> iov_len. = .strlen (sänd sträng) .- .1; ... ... ... .printf ("kddkdd.% d.% d.% s  n", .sizeof (skicka sträng), .strlen (skicka samling вки),. skicka sträng); ... ... ... ... ... ... ... .//sendto(sockfd,sändlinje,strlen(sändlinje),0,(struct .sockaddr. *) & servaddr, sizeof (servaddr )); ... ! ... ... ... .om. ((sendmsg (sockfd ,. & header, .0)). == .- 1) ! ! ! :) ... ... ... ... ... ... ! . ! . ! ... ... ... ... ... ? ? ? ? ... ... ... ... .printf ("Fel. i .sendmsg,  t. [Fel. =.% d]  n", .error); ** kundvård ** ** cr **. ... ... ...#om .0 ... ** kundvård ** ** cr **. ... ... .om. ((n = recvfrom (sockfd, recvline, 10000,0, NULL, NULL)). == .- 1) :. ... ... ... ... . ... ... ... ! . . ! ! ! ... ... ... ... ... . . .printf ("recvfrom .error  n"); ... ... ... -. ... ... ... ... ... ! ... ! ... ... .slut (1); ... ... ? ! ... ... ... ... ... .recvline [n] = 0; ... ... ... ... .fputs (recvline, stdout); ... ... ... .printf ("paket. omdirigerad  n  n");#slut om ... ... ... ... ... ... ... ... ... .Tillbaka .0; 

Reimage: Programvaran #1 för att fixa Windows-fel

Körs din dator långsamt? Får du hela tiden Blue Screen of Death? Gör ditt antivirusprogram inte sitt jobb ordentligt? Var inte rädd, för Restoro är här! Denna kraftfulla mjukvara reparerar snabbt och enkelt alla typer av vanliga Windows-fel, skyddar dina filer från att gå förlorade eller skadas och optimerar din dator för maximal prestanda. Du behöver aldrig oroa dig för att din dator ska krascha igen - med Restoro ombord är du garanterad en smidig, problemfri datorupplevelse. Så vänta inte längre - ladda ner Restoro idag!

  • 1. Ladda ner och installera Reimage
  • 2. Öppna programmet och klicka på "Skanna"
  • 3. Klicka på "Reparera" för att starta återställningsprocessen

  •   [root @ localhost .udp] nummer ../client 30.5.42.194Ange en ämnestid för sändningsuravFel i sendmsg, [errno = 105]Ange en allmän sträng för att skicka     

    Jag använder RHEL (Red Hat 4.1.2-48) med kärnan 2.6.18-194.el5 som har gcc-alternativ 4.1.2

    Ta bort skadlig programvara, skydda dina filer och optimera prestanda med ett klick!