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).