Socket server TCP em C – Intel Edison

socket

Neste artigo, será mostrado como desenvolver um programa básico de socket server TCP utilizando linguagem C, compilado e executado no Linux da placa Intel Edison. Com este exemplo, será possível estabelecer uma conexão via socket com a Intel Edison e ligar e desligar um led através de comandos enviados do cliente para o servidor (Intel Edison).

Pré-requisitos

Para conseguir compreender e reproduzir o exemplo aqui fornecido, será necessário:

Antes de botar a mão na massa, vamos falar um pouco sobre sockets.

Sockets

A grande maioria da comunicação entre processos distintos via rede (internet ou em rede local) utiliza o modelo Cliente-Servidor. Neste modelo, o cliente se conecta ao servidor e, a partir disto, a comunicação entre ambos é estabelecida até que um dos dois encerre a comunicação. Para isto funcionar, os seguintes pontos devem ser ressaltados: 

Em outras palavras, uma comunicação via socket é como se fosse uma ligação telefônica: há um servidor (pessoa a ser contactada) e um cliente (a pessoa que deseja contatar o servidor). O servidor possui uma identificação única na rede (na rede telefônica seria um número de telefone, já em uma rede de dados seria um IP e porta válidos) e o cliente, conhecendo esta identificação, é capaz de entrar em contato com o servidor e estabelecer uma conexão. Quando o cliente não desejar mais se comunicar ou quando o servidor precisar interromper a comunicação, a ligação é encerrada.

Na comunicação via socket as coisas funcionam exatamente da mesma maneira. Para compreender como a comunicação com base em sockets é feita no C, observe o diagrama da figura 1.

Figura 1 – Diagrama de comunicação de sockets TCP em C

Há dois tipos básicos de protocolos que os sockets podem operar: TCP e UDP. Sockets TCP são utilizados quando é necessário ter garantia que um dado enviado pelo remetente realmente chegou ao destinatário. Já UDP é utilizado quando o volume de dados a ser transmitido é grande e não há necessidade de garantia de recepção de todos os dados (exemplo: streaming de vídeo). O programa-exemplo deste artigo irá compreender o uso de socket no protocolo TCP.

Agora mãos à obra!

Uma vez que já foram revistos os conceitos básicos de sockets, vamos botar a mão na massa! 

No programa-exemplo deste artigo, o Intel Edison será o servidor, capaz de se comunicar pela porta 8888 com um cliente. Uma vez estabelecida a conexão, uma mensagem de boas vindas é enviada ao cliente, bem como o número de seu IP (obtido pelo servidor). Além disso, após estabelecida a conexão, se for recebido um ‘L’ do cliente, a Intel Edison irá acender um led. Já se for recebido um ‘D’, a Intel Edison irá apagar o led.

 O código-fonte do exemplo é o seguinte:

Instruções de como colocar o código no Intel Edison, compilar e rodar

Assumindo que você já esteja conectado à placa Intel Edison via um terminal serial ou SSH, que você esteja logado e que a Intel Edison está conectada na rede via Wi-Fi nativo dele, o primeiro passo é saber seu IP. Para isto, digite o seguinte comando: 

Como resultado do comando, irão aparecer todas as interfaces de rede e usb presentes no momento. Procure por wlan0 e, nos dados da interface, constará o IP. Anote-o, ele será útil mais pra frente neste artigo.

Feito isto, devemos criar o arquivo .c do programa. Para isso utilizaremos o vi. Para tal, digite o seguinte comando: 

No vi, aperte a letra ‘I’ para entrar em modo de inserção. Agora, copie o código-fonte e cole no vi. Para colar o código-fonte, pressione o botão direto do mouse sobre qualquer área da tela do terminal serial/SSH. Feito isso, preesione a tecla ESC, digite dois pontos, digite wq e depois dê Enter. Esta combinação (que mais parece um macete de videogame) garante que o arquivo socketserver.c será salvo e que após fazer isso o vi seja fechado.

Agora estamos prontos para compilar e rodar o código. Para compilar, digite o seguinte comando:

Após a compilação, podemos rodar o programa. Para isso, digite:

Pronto, agora você está pronto para se comunicar via socket com sua Intel Edison! Para isto, basta utilizar um programa hyperterminal, conectar-se ao IP da Intel Edison e na porta informada no código-fonte.

Para ver o projeto em ação, veja este vídeo.

Referências

Como referências, recomendo duas fontes interessantes: