PROCURAR:     
  Quinta, 26/11/2009
» Introdução
» Programação
» Administração
» Hardware
» Aplicativos
» Jogos
» Segurança
» Editorial
» Entrevistas
» Fórum
» Links
» Notícias
» Pegue o Linux
» Documentação
» Programas
» Dúvidas
» Oportunidades
» Sobre
» Contato
» Publicidade
 
Powered By:
DEBIAN
GNU/LINUX
 
English Version
 
 
Tutorial de sockets - Parte IV
Por: Frederico Perim

close() e shutdown() - Saia daqui!

Nossa! Você enviou e recebeu dados o dia inteiro, e já está não aguenta mais. Você está pronto para fechar a conexão em um descritor socket. Isso é fácil. Você pode usar a função close() do Unix:

close(sockfd);

Isso irá evitar escrever ou ler através deste socket. Se alguém tentar se conectar, receberá uma mensagem de erro.

Caso você queira ter mais controle sobre como o socket fecha,você pode usar a função shutdown(). Ela te permite encerrar a conexão em uma determinada direção, ou em ambas(como close()):

int shutdown(int sockfd, int how);

socfd é o socket que você deseja encerrar, é how pode ser o seguinte:

  • 0 - encerra o recebimento;
  • 1 - encerra o envio;
  • 2 - encerra o recebimento e envio(como close()).

shutdown() retorna 0 em caso de sucesso, e -1 caso contrário.

Se você insistir em usar shutdown() em sockets de datagrama, ele vai fazer com que socket fique indisponível para futuras chamadas recv() e send()(lembre-se de que você pode usá-las caso use connect() em seus "SOCK_DGRAM").

É importante ressaltar que shutdown() não fecha o descritor de arquivo, apenas muda sua usabilidade. Para liberar um descritor socket, você precisa usar close().

getpeername() - Quem é você?

Essa função é fácil.

É tão fácil, que quase não dedico uma seção. Mas enfim, aqui está.

A função getpeername() irá dizer quem está conectado na outra extremidade de um stream socket. A sinopse:

        

        int getpeername(int sockfd, struct sockaddr *addr, int
*addrlen);
    

sockfd é o descritor do socket conectado, addr é um ponteiro para um struct sockaddr(ou uma struct sockaddr_in) que vai ter informações sobre o outro lado da conexão, e addrlen é um ponteiro para um int, que deve ser inicializado como sizeof(struct sockaddr).

Uma vez que você tenha o endereço, você pode usar inet_ntoa() ou gethostbyaddr() para imprimir ou obter mais informação. Não , você não pode ler o nome de login. (Tá bom, Se outro computador estiver rodando um ident daemon, isso é possível.Mas isso está além do escopo deste documento).


Próximo»

close() e shutdown() - Saia daqui!
getpeername() - Quem é você?
gethostname() - Quem sou eu?
DNS - Você diz "receita.fazenda.gov.br", eu digo "161.148.231.100"


Enviar para um amigo

Imprimir

Índice de artigos

ENQUETE
Quais são as suas expectativas quanto ao OpenSUSE 11.2?

Que ele venha mais rápido
Seja mais leve
Mais bonito
Outros


NEWSLETTER
Inscreva-se e receba as últimas notícias, programas, artigos, novidades e tudo do mundo Linux que aconteceu na semana.
 
Digite seu email:

Publicidade / Sobre OLinux / Entre em Contato / Privacidade
Copyright (c) 1999-2009, OLinux - O Portal de Linux do Brasil.
Desenvolvido por: Linux Solutions
Todos os Direitos Reservados.