Criando um Socket em Linguagem C




Olá pessoal, hoje nós aprenderemos a como criar um socket em linguagem C, sockets são mecanismos de comunicação normalmente usados para estabelecer uma conexão entre cliente e servidor, ou seja, sockets podem ser usados em ligações de redes de computadores para um fim de um elo bidirecional de comunicação entre dois programas. Em outras palavras, os sockets são utilizados para fazer o acesso aos serviços da camada de transporte, portanto usando essa ferramenta podemos acessar vários protocolos dessa camada, sendo eles TCP, UDP, entre outros. Antes de começarmos é importante vermos alguns conceitos fundamentais:


Domínios


Domínios são espaços de possíveis endereços utilizados para fazer referência aos seus respectivos sockets, os sockets utilizam esses endereços para se auto referenciarem, sendo assim, cada socket possui seu próprio endereço. Abaixo temos alguns exemplos de Domínios:

AF_INET------(ARPA INTERNET PROTOCOLS) "O que iremos utilizar"
AF_UNIX------(UNIX INTERNET PROTOCOLS)
AF_ISO-------(ISO PROTOCOLS)
AF_NS--------(XEROX NETWORK SYSTEM PROTOCOLS)

 

Tipos de Sockets


SOCK_STREAM -> Comunicação confiável (para comunicações TCP)
SOCK_DGRAM ->  Comunicação rápida (Para comunicações UDP)

Construindo o Código


Agora chega de papo, vamos ao que realmente interessa! Abra seu terminal e crie um arquivo com estensão .c tipo "socket.c" e abra esse arquivo usando um editor de sua preferência.

Para começar colocaremos inicialmente as bibliotecas que permitiram usar as funções necessárias para estabeler uma conexão usando o Socket e utilizar outras funcionalidades da linguagem C, são elas:


    #include<stdio.h>
    #include<netdb.h>
    #include<unistd.h>

Logo após iremos declarar três variáveis do tipo int e um vetor de char 20 posições, as três variáveis inteiras serão usadas para identificar a porta, criar o socket e estabelecer uma conexão com um host através da porta informada e o vetor de char informaremos esse o endereço do host:

    int meuPrimeiroSocket;
    int conexao;
    int porta;
    char ip[20];

Depois colocaremos um printf solicitando que o usuários digite o número da porta e o endereço host para estabelecer a conexão e um "scanf" que permitirá que o usuário informe a porta e o host nos quais o socket estabelecerá a conexão, é ideial que você coloque um espaço entre a aspa e a porcentagem do %d para evitar pegar o buffer do teclado, utilize o seguinte formato:


   printf("Digite o numero da porta e o endereco ip: ");
   scanf(" %d %s",&porta,ip);

Agora criaremos uma struct do tipo sockaddr_in para estabelecer conexão com a internet.

    struct sockaddr_in alvo;

Logo após a variável criada para ser o socket receberá como atributo as configurações de conexão necessárias da função socket como: socket(AF_INET,SOCK_STREAM,0). Sendo  o AF_INET a família de protocolos que iremos usar para trabalhar com a internet, SOCK_STREM para  
trabalharmos com protocolo TCP e o 0 (zero) é uma referência ao protocolo ip:

    meuPrimeiroSocket = socket(AF_INET,SOCK_STREAM,0);

Lembra da struct que criamos? Agora é hora de configurar a conexão e atribuir a porta e o endereço de ip digitados anteriormente.

    alvo.sin_family = AF_INET;
    alvo.sin_port = htons(porta);
    alvo.sin_addr.s_addr = inet_addr(ip);

Nesse momento estamos com o tipo de conexão configurada para o nosso socket, porta e endereço de ip definidos, o que nos falta agora é simplesmente conectar e a para isso faremos da seguinte forma, lembra lá em cima de uma variável que criamos para estabelecer a conexão? É a vez dela agora.

    conexao = connect(meuPrimeiroSocket, (struct sockaddr *)&alvo,sizeof alvo);

Contudo não basta apenas conectar, temos que ter certeza se a conexão foi estabelecida com sucesso. Caso tenha sido efetuada imprimiremos na tela "Porta Aberta" e fecharemos a conexão, caso n seja possível imprimiremos "Porta Fechada".

    if( conexao == 0 ){
        printf("Porta Aberta\n");
        close(meuPrimeiroSocket);
        close(conexao);
    }else{
        printf("Porta Fechada\n");
    }

    return 0;

Por fim a estrutura do nosso código de conexão ficará no formato apresentado abaixo.
Valeu pessoal ;)

 #include<stdio.h>
 #include<netdb.h>
 #include<unistd.h>

int main(){

    int meuPrimeiroSocket;
    int conexao;
    int porta;
    char ip[20];


   printf("Digite o numero da porta e o endereco ip: ");
    scanf(" %d %s",&porta,ip);

    struct sockaddr_in alvo;
    meuPrimeiroSocket = socket(AF_INET,SOCK_STREAM,0);

   
     alvo.sin_family = AF_INET;
     alvo.sin_port = htons(porta); 
     alvo.sin_addr.s_addr = inet_addr(ip);

   conexao = connect(meuPrimeiroSocket, (struct sockaddr *)&alvo,sizeof alvo);

    if( conexao == 0 ){
        printf("Porta Aberta\n");
        close(meuPrimeiroSocket);
        close(conexao);
    }else{
        printf("Porta Fechada\n");
    }

    return 0;
}

0 comentários:

Postar um comentário