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:

  • Possuir um Intel Edison;
  • Possuir Arduino Expansion Board e Base Shield (ambos presentes no kit de sensores Groove);
  • Conhecer comandos básicos de Linux;
  • Dominar alguma forma de acesso à Intel Edison (conexão via terminal serial ou SSH). Aqui eu gostaria de recomendar o uso do PuTTY;
  • Conhecimentos básicos de linguagem C;
  • Possuir um hyperterminal qualquer no computador cliente (o próprio PuTTY pode ser usado para isto).

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: 

  • O cliente deve “saber” que o servidor existe (ou seja, qual seu IP e porta disponíveis para comunicação);
  • O servidor normalmente não “sabe” da existência do cliente, tão quanto garante exclusividade de conexão com um determinado cliente. Logo, qualquer programa capaz de se conectar ao IP e uma das portas disponíveis para comunicação do servidor, é certamente capaz de se comunicar com o servidor;
  • Normalmente, o detentor das informações mais importantes da comunicação é o servidor. Logo, em geral, o cliente é quem solicita informações e envia comandos ao servidor. 

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.

socket tcp em c
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:

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

[wpseo_breadcrumb]
Comentários:
Notificações
Notificar
guest
5 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Marcio Piai
Marcio Piai
27/12/2016 15:49

Boa tarde Pedro, Achei muito boa a tua reportagem, e tomei a liberdade de tirar uma dúvida que está me incomodando. Primeiramente deixe-me apresentar. Sou o Marcio Piai, trabalho com sistemas de controle semafórico de trânsito. Utilizo no campo (controladores de semáforos), sistema Linux (Gentoo V2.4) rodando em CPUs industriais. Temos uma Central de controle onde roda PCs normais com Windows. Minha dúvida é o seguinte: A função SEND do socket (Socket TCP) não retorna -1 em caso de não conectividade. Ela retorna o tamanho da string a ser enviada estando a rede conectada ou não. Eu gostaria que ela… Leia mais »

Cleiton Bueno
Reply to  Marcio Piai
27/12/2016 16:59

Olá Marcio, no caso a função send() não irá retornar erro de “conectividade” e sim algum erro durante o processo de envio, erro de conectividade você teria na função connect(). Você deve verificar o retorno de todas as etapas incluido o socket(AF_INET, SOCK_STREAM, 0) por exemplo onde você irá receber o file descriptor referente ao socket. Agora falando apenas do send(), em caso de sucesso é retornado o numero de bytes enviados, caso contrario é retornado -1 e você pode errno é configurado com a erro. Você deverá incluir #include , e usar algo como: printf (“Error is : %dn”,… Leia mais »

Marcio Piai
Marcio Piai
Reply to  Cleiton Bueno
28/12/2016 09:36

Obrigado pela dica Cleiton.
Bom ano anovo.

Marcio Piai
Marcio Piai
Reply to  Cleiton Bueno
29/12/2016 15:09

Cleiton Obrigado pela atenção. Vou ter que pesquisar mais profundamente esses conceitos de sockets. Apliquei a função errno, porém o comando send dá o mesmo código de erro, estando a rede conectada ou não. Tem um porém: Quando eu abro o socket, conecto, se a conexão estiver OK eu envio vários comandos SEND. Após eu enviar uns dez comandos SEND eu fecho o Socket, reabro, reconecto e envio mais uns dez, e assim por diante. Eu não queria abrir, conectar e enviar e fechar a cada string, por questões de performance. O que acontece é que no meio dos 10… Leia mais »

Cleiton Bueno
Reply to  Marcio Piai
30/12/2016 11:54

Marcio se puder me passa o erro que é retornado logo ao executar o send().
Se esta usando TCP realmente não faz sentido ficar conectando/desconectando para um mesmo destino.

Abraços.

Talvez você goste:

Séries

Menu
Privacy Settings saved!
Configurações de Privacidade

Entenda quais dados e informações usamos para ter melhor entrega de conteúdo personalizado para você.

These cookies are necessary for the website to function and cannot be switched off in our systems.

Para usar este site, usamos os seguintes cookies tecnicamente exigidos

  • wordpress_test_cookie
  • wordpress_logged_in_
  • wordpress_sec

Decline all Services
Accept all Services