Dicas Para Cuidar Do Erro Sendmsg

Você precisa de um computador mais rápido, mais estável e otimizado para desempenho? Então tente Reimage.

Nas últimas semanas, a experiência de alguns usuários relatou um erro no momento do envio de uma mensagem.O objetivo relacionado a sendmsg () é enviar qualquer tipo de mensagem através de um soquete simples, graças a ou sem conexão. Normalmente, quando s é um soquete sem conexão, o conceito é enviado ao ponto retratado por msghdr. Se esta mensagem for definitivamente muito longa para tentar mudar para o protocolo subjacente, sendmsg () certamente irá parar e nenhum dado será enviado.

Estou tendo problemas para programar soquetes UDP. Desejo usar as APIs sendmsg () e, além disso, recvmsg () para poder se comunicar entre o tomador do empréstimo e, frequentemente, o servidor. O código do cliente voltou definitivamente com um erro 105 ENOBUFS. Não tenho ideia de por que novamente está mostrando este erro informativo importante, porque de acordo com a descrição entre essas APIs, ele está registrado

sendmsg error

  ENOBUFSA fila de resultados do curso da rede está cheia. Na grande maioria dos casos, isso significa que a interação parou de transmitir, mas isso deve ser devido a um excesso de estoque momentâneo. (Isso geralmente não pode acontecer no Linux. Os pacotes são simplesmente descartados silenciosamente, já que a fila do melhor dispositivo também está cheia.) 

sendmsg error

Então, esse erro não é comum e / ou eu encontrei este. Se alguém tiver problemas semelhantes, por favor, transmita as informações. Estou procurando uma solução, não uma resposta pronta para uso. Também não use a API alternativa. Forwork, você precisará da seguinte parte relacionada ao código.

Código do servidor

Sendmsg atômico?

sendmsg pode ser uma operação atômica incrível. Com UDP, você realmente pode ler mais em comparação com o que um datagrama por vez. Se você usar sockets para obter datagramas, veja o que os especialistas dizem por que o vetor de E / S parece ter espaço de buffer suficiente para conter este grande datagrama de entrada.

  #include #include # enable #include #include #include #include # define PORTA 32000# define BUFSIZE 8192int home ()    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    socklen_t len;    mesg [1000]; char char message_control_array [BUFSIZE];    adicionar int = 1;    struct iovec io;    int ret é igual a 0;    o intervalo ttval é igual a 255;    / - A estrutura dos títulos das mensagens a serem exibidos ao chamar recvmsg 3. /    h2 tags struct msghdr;    / - Esta estrutura geralmente contém mensagens mais profundas separadas * /    struct cmsghdr * cmsg;    / * Preencha as variáveis ​​fiscais mais importantes. * /    header.msg_name = & servaddr;    header.msg_namelen = sizeof Sockaddr_in); (struct header.msg_control Message_control_array; = header.msg_controller significa BUFSIZE;   .Msg_iov é igual a & io;    header.message; msg_iov-> iov_base = header.msg_iov-> iov_len 1000; é igual a header.msg_iovlen é 1;    ou * Crie o soquete 6 do UDP. /    na matéria ((sockfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) <0)                printf ("Erro 1: socket  n");            Sair (1);        ret corresponde a setsockopt (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    if (ret == -1)                printf ("setsockopt recusa Errno ip_ttl,% d  n", errno);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family implica AF_INET;    servaddr.sin_addr.s_addr = htonl (INADDR_ANY);    servaddr.sin_port é igual a htons (PORT);    como se ((bind (sockfd, (struct sockaddr *) & servaddr, sizeof (servaddr))) == -1)                printf ("Erro 2: ingressar  n");            Sair (1);        durante (1)  // len implica sizeof (cliaddr);  // if ((n corresponde a recvfrom (sockfd, mesg, 1000,0, (struct sockaddr *) & cliaddr, & len)) == -1)  em maiúsculas e minúsculas ((n = recvmsg (sockfd, & header, 0)) == -1)                printf ("falhas de recvmsg !!!!!!!!!!!!!  n  n");        versus * Devolver o pacote recebido ao remetente [cliente] * /    // sendto (sockfd, mesg, n, 0, (struct sockaddr *) & cliaddr, sizeof (cliaddr));    printf ("---------------------------------------------- - ---------- --------  Não ");    mesg [n] significa 0;   Printf ("Obtenha todos os seguintes:  n");    printf ("% folks  n", mensagem);    printf ("A informação normalmente vem por meio da estrutura msghdr  n");    printf ("Endereço local% south  n", inet_ntoa (servaddr.sin_addr.s_addr));    source printf ("Intervalo de endereços%  n", (int) header.msg_namelen);    versus (cmsg = CMSG_FIRSTHDR (& header); cmsg! corresponde a NULL; cmsg é igual a CMSG_NXTHDR (& header, cmsg))                printf ("número% d plano cmsg  n", contagem ++);            //E se      printf ("---------------------------------------------- - ---------- --------  Não ");Retorna 0; 

Código do cliente

O que é enviado no Linux?

DESIGNAÇÃO. As chamadas de sistema send (), sendto () e, além disso, sendmsg () permanecem usadas para enviar uma mensagem de texto para um soquete diferente. O contato transfer () só pode ser usado se este soquete estiver em um pipeline muito conectado (de forma que o telefone pretendido também seja conhecido). A única diferença entre os dois entre send () e note () é a presença de sinalizadores.

  * Exemplo de cliente UDP - /# enable #include #include #include #include #include #include #include # define PORT 3200#define BUFSIZE 512int típico (int argc, char ** argv)    int sockfd, n;    struct sockaddr_in servaddr, cliaddr;    a string para obter o caractere [BUFSIZE];    char recvline [BUFSIZE];    ret int = 0;    intervalo ttval = 255;            / 4. necessária para publicar dados adicionais com a ajuda de sendmsg () call * /            h2 tags struct msghdr;    struct cmsghdr 2. cmsg;    struct iovec io;    como (argumento 2) ! =            printf ("Uso:% 's   n", argv [0]);            Sair (1);        sockfd = plug (AF_INET, SOCK_DGRAM, IPPROTO_UDP);    ret significa setockopt (sockfd, IPPROTO_IP, IP_TTL, & ttlval, sizeof (ttlval));    todas as vezes (ret == -1)                printf ("setsockopt não funciona para IP_TTL. Erro% d  n", erro);        bzero (& servaddr, sizeof (servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_addr.s_addr = inet_addr (argv [1]);    servaddr.sin_port é igual a htons (PORT);    header.msg_name pode & servaddr;    header.msg_namelen significa que Sockaddr_in size); (struct header.msg_iov provavelmente será & io;    header.msg_iov-> iov_base = enviar string;   Cabeçalho .msg_iov-> iov_len = BUFSIZE;    header.msg_iovlen = 1;    durante (1)     tryagain: printf ("Por favor, enrole em uma string para realmente obter  n");     // scanf ("% s", enviar string);     se possível ((fgets (enviar string, 100, stdin)) == NULL)                  printf ("Erro ao ler stdin  e  n");             Vou tentar de novo;         header.msg_iov-> iov_len. = .strlen (enviar string) .- .1; ... ... ... .printf ("kddkdd.% d.% d.% adverts  n", .sizeof (enviar string), .strlen (enviar número вки) ,. enviar string); ... ... ... ... ... ... ... ... .//sendto(sockfd,sendline,strlen(sendline),0,(struct .sockaddr. *) & servaddr, sizeof (servaddr )); ...! ... ... ... .deve. ((sendmsg (sockfd,. & header, .0)). == .- 1) ! :! ! ... ... ... ... ... ...! ! ... ... ... ... ...? ... ... ... ... .printf ("Erro. ​​in .sendmsg,  t. [Erro. ​​=.% d]  n", .error); ** cr ** ** atendimento ao cliente **. ... ... ...#if .0 ... ** cr ** ** atendimento ao cliente **. ... ... .E se. ((n implica recvfrom (sockfd, recvline, 10000,0, NULL, NULL)). == .- 1) : ... ... ... ...; ... ... ...! :)! ! ... ... ... ... ..., .printf ("recvfrom .error  n"); ... ... ... -. ... ... ... ... ...! ...! ... ... fim (1); ... ...! ! ... ... ... ... ... .recvline [n] é igual a 0; ... ... ... ... .fputs (recvline, stdout); ... ... ... .printf ("pacote. enviado  n  n");#fim se ... ... ... ... ... ... ... ... ... .Voltar .0; 

Reimage: o software nº 1 para corrigir erros do Windows

O seu computador está lento? Você continua recebendo a tela azul da morte? Seu software antivírus não está fazendo seu trabalho corretamente? Bem, não tenha medo, porque o Restoro está aqui! Este poderoso software reparará rápida e facilmente todos os tipos de erros comuns do Windows, protegerá seus arquivos contra perda ou corrupção e otimizará seu PC para obter o máximo desempenho. Você nunca mais terá que se preocupar com o travamento do seu computador - com o Restoro integrado, você garante uma experiência de computação suave e sem problemas. Então não espere mais - baixe o Restoro hoje mesmo!

  • 1. Baixe e instale o Reimage
  • 2. Abra o programa e clique em "Digitalizar"
  • 3. Clique em "Reparar" para iniciar o processo de restauração

  •   [root - localhost .udp] # ../client 30.5.42.194Insira um material para enviarsuravErro em sendmsg, [errno significa 105]Digite a string para enviar     

    Eu pela manhã usando RHEL (Red Hat 4.1.2-48) com o kernel 2.6.18-194.el5 com preferência pessoal gcc 4.1.2

    Remova malware, proteja seus arquivos e otimize o desempenho com um clique!