Sintaxe da função SendFile na linguagem C
sendfile (int out_fd, int in_fd, off_t * offset ", size_t" "contagem");
O deslocamento in_fd, out_fd, off_t * e os argumentos de contagem size_t são necessários para que a função funcione. Os detalhes completos desses argumentos são os seguintes:
Os descritores de arquivos "em FD" e "Out FD" devem ser atribuídos para leitura e escrita, respectivamente. Se o valor do deslocamento não for nulo, ele se refere a uma variável que mantém o deslocamento do arquivo do qual o sendfile () começará a ler os dados do FD. Essa variável será atualizada para os bytes do deslocamento que ocorre após o último byte read quando o sendfile () retornar. Sendfile () não altera a compensação atual do arquivo em FD se o deslocamento não for nulo; Caso contrário, o deslocamento do arquivo atual é modificado para refletir os bytes lidos em número de “em FD”. O parâmetro da contagem especifica quantos bytes devem ser copiados entre os descritores de arquivo.
O valor dos bytes escrito para "FD" é revertido se a comunicação for bem -sucedida. Vale a pena notar que uma chamada bem -sucedida para sendfile () pode resultar em menos bytes sendo escritos do que o necessário; O chamador deve estar disposto a tentar novamente a operação, se houver algum bytes de desdobramento. Além disso, se houver uma exceção, se -1 for fornecido, e errno for definido adequadamente.
Erro da função sendfile () na linguagem C
EAGIN: Não bloqueando a gravação deve bloquear, pois a E/S está configurada com o On -Block.
Ebadf: O arquivo de entrada ou saída não pôde ser acessado para leitura ou escrita.
Efault: Um endereço incorreto foi inserido.
Einval: O descritor é inválido ou bloqueado, ou uma operação do tipo MMAP (2) para “em FD” não é acessível.
Ao ler de “In FD”, EIO: erro não especificado.
Enomem: Incapaz de adquirir do "in fd" devido à falta de memória.
Exemplo 1: Envie o arquivo do lado do servidor em C Language no Ubuntu 20.04
Demonstramos como enviar os arquivos do lado do servidor, que é aceito pelo lado do cliente no exemplo a seguir usando a chamada do sistema sendfile:
Não entraremos nos detalhes sobre esse código, porque estamos interessados apenas na chamada do sistema de função sendfile de programação C, que é usada para transferir um arquivo para o nosso código do lado do cliente. Aqui, incluímos todos os arquivos de cabeçalho aplicáveis na seção de cabeçalho e definimos algumas diretivas de macros. Depois disso, criamos uma função para limpar o buffer e uma função cifra para a criptografia. Depois vem para a função int sendfile para enviar o arquivo.
O construtor é declarado para a função SendFile, onde o arquivo e o buffer são definidos. O algoritmo para enviar os arquivos para o lado do cliente é executado. Primeiro, o nome do arquivo é enviado ao servidor. Se o arquivo estiver presente, o servidor começará a lê -lo e continuará enviando um buffer cheio de dados. Até o final do arquivo, o conteúdo é criptografado.
Então, temos o código do driver da função principal. Dentro da seção de função principal, definimos as variáveis e variáveis estruturais que são necessárias. A função send_file () envia os dados do arquivo associado ao identificador de arquivo aberto sobre a conexão associada ao soquete.
Utilizamos a função do soquete e passamos os parâmetros aplicáveis a ela. Realizamos a condição if-else na variável do método de soquete, “Sockfd”. Se o "Sockfd" for menor que o valor 0, o printf é chamado e imprime a declaração do descritor de arquivo que não é recebido. Caso contrário, a compilação é encerrada exibindo a instrução else. Novamente usamos a condição IF-Else, onde o método de ligação é chamado para fins de binging. O método de ligação contém os parâmetros necessários. Se a operação do método de ligação for igual ao valor zero, o "Binded com sucesso" será impresso. Se não conseguir alcançar a condição, a declaração “falha na ligação” será exibida na tela Prompt.
O loop while é implantado para receber o nome do arquivo. Ao receber o nome do arquivo, a declaração “Aguardando o nome do arquivo” é exibida. Depois disso, o nome do arquivo é recebido do clear_buf (). Através do "FOPEN", lemos o arquivo e imprimimos a mensagem "Nome do arquivo recebido" junto com o nome do arquivo. Se o arquivo for nulo, a declaração "Arquivo aberto falhou" será impresso. Caso contrário, o "arquivo aberto com sucesso" é executado. Dentro do próximo loop durante o loop, executamos o processo sendfile e enviamos o arquivo com a chamada do sistema sendto. No final, o arquivo está fechado.
Após a compilação do código, enviamos o arquivo com sucesso para o cliente-servidor pela chamada do sistema sendfile.
Exemplo 2: Envie um arquivo do lado do cliente em C Language no Ubuntu 20.04
Como vimos na instância anterior, enviamos o arquivo com sucesso para o código do servidor. Nesse caso, recebemos os dados do arquivo enviado pelo servidor.
Basta vir ao método "Recvfile", onde recebemos o arquivo aplicando o algoritmo especificado. Um sinal do modo de conexão de um soquete ou modo sem conexão deve ser recebido pelo método Recvfile (). Como impede que o aplicativo recupere o endereço da fonte dos dados recebidos, geralmente é usado com soquetes vinculados. Os buffers do arquivo são recebidos até que o final do arquivo seja recebido. Os dados são então descriptografados. Depois disso, temos um código de motorista. Dentro da função principal, operamos para conectar o método do foguete e recebemos o arquivo.
Essas são as seguintes afirmações impressas ao receber os arquivos. Podemos ler o conteúdo dos dados do arquivo especificado dentro do cliente-servidor:
Conclusão
Para facilitar as coisas para nossos usuários, este post revisou todos os aspectos técnicos do uso da função c sendfile () na programação do soquete. O processo pode ser consideravelmente acelerar usando o sendfile. Outras medidas, como estabelecer com precisão os parâmetros do soquete, devem ser seguidos para garantir que a transferência de rede seja tão eficiente quanto viável. Para tornar isso possível, tentamos incluir os exemplos fáceis. Como resultado, qualquer pessoa que use C que precise de ajuda com a função "sendfile ()" achará esses dados úteis.