Veremos agora algumas funções úteis para a programação com sockets:
uint16_t htons(uint16_t hostshort);
Converte um short int com o número da porta (no caso de um intel, little endian), para um número de porta utilizando network byte order (big endian).
servidor.sin_port=htons(4050); // (seta a porta para 4050)
in_addr_t inet_addr(const char *cp);
Seta o endereço do host.
servidor.sin_addr.s_addr=inet_addr(“200.164.72.31”);
struct hostent *gethostbyname(const char *name);
Utilizada para resolução de nomes. A estrtura hostent é:
struct hostent {
char *h_name; /* Nome oficial do host */
char **h_aliases; /* Lista de aliases */
int h_addrtype; /* Tipo de endereco do host */
int h_length; /* Tamanho do endereco */
char **h_addr_list; /* Lista de enderecos do
servidor de nomes */
};
ssize_t send(int s, const void *buf, size_t len, int flags);
Envia uma mensagem através da conexão. *buf é a string a ser enviada, len é o tamanho da string e flags são parâmetros para envio da mensagem. Quando flags é igual a 0, ela se comporta como a função write().
send(Novosocket, “HelloWorld!\n”, 12, 0);
Exemplo prático de um cliente que se conecta em um servidor e envia uma mensagem de saudação:
//Headers necessários
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/signal.h>
#include <errno.h>
#include <netdb.h>
int main(){
int sock;
struct sockaddr_in server;
int conn;
//cria o soquete
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock < 0) //verifica erros
{
perror(“Erro ao criar soquete.”);
exit(1);
}
//preenche a estrutra com dados do servidor.
server.sin_family = AF_INET;
server.sin_port = htons(7000);
server.sin_addr.s_addr = inet_addr(“192.168.2.1”);
bzero(&(server.sin_zero),8);
//estabelece a conexão com o host
conn = connect(sock,(struct sockaddr * )&server, sizeof(server));
if(conn < 0) { //checa por erros
perror(“Erro ao conectar”);
exit(1);
} else {
send(Novosocket, “HelloWorld!\n”, 12, 0); //envia a mensagem
}
}
Vimos até agora como criar um cliente que se conecta a um servidor. Um exemplo básico que ilustra como conectar e como enviar mensagens ao mesmo. Apesar de básico, reflita: Se você consegue fazer algo simples, o que te impede de fazer algo complexo?
to be continued…