Arquivo para outubro, 2008

Controlador Ethernet ENC28J60

Posted in Uncategorized on outubro 11, 2008 by overmindbr

Eis um chip da Microchip que implementa a camada de Enlace e Física. Tem seu próprio endereço MAC, PHY 10BASE-T, 8KByte de memória ram (buffer) e se comunica utilizando uma interface SPI. Utiliza um cristal de 25 MHz e comunica-se à  Custa cerca de 4 dólares cada e é voltada para dispositivos que necessitam de acesso a internet. Sua única dificuldade, assim como qualquer implementação Ethernet, são os circuitos externos necessários, como alguns indutores e filtros de ferrite.

Saiba mais em: http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en022889

Unix Sockets em C parte 2

Posted in Uncategorized on outubro 10, 2008 by overmindbr

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…

Unix Sockets em C parte 1

Posted in Uncategorized on outubro 7, 2008 by overmindbr

Irei agora iniciar agora alguns posts sobre programação de Sockets em C para ambientes Unix (utilizei o linux para testes).  Antes de iniciar a programação, será necessário incluir os seguintes cabeçalhos no seus programas, mas dependendo da situação necessitará de outros:

#include <sys/types.h>
#include <sys/sockets.h>
#include <netinet/in.h>
#include <netdb.h>

Os sockets, como a maioria da comunicação de entrada e saída no unix, são declarados utilizando inteiros:

int soquete;

A estrutura que contém os dados relacionados ao host ao qual se quer conectar é a sockaddr_in:

struct sockaddr_in {
short int sin_family;         /* Familia do endereco */
unsigned short int sin_port;  /* Numero da porta */
struct in_addr sin_addr;      /* IP do Host */
unsigned char sin_zero[8];    /* Zera a estrutura, algum espaco como
struct sockaddr */

}

O short int sin_family normalmente será AF_INET, que significa (ARPA INTERNET PROTOCOLS),  sin_port o número da porta e sin_addr o número do ip do host.

Para criar um socket utilizamos a função int socket(int domain, int type, int protocol);

O tipo de socket será SOCK_STREAM ou SOCK_DGRAM, onde o primeiro é utilizado por conexões TCP e o segundo por UDP.

O número do protocolo usado será:

0 – IP – INTERNET PROTOCOL
1 – ICMP – INTERNET CONTROL MESSAGE PROTOCOL
2 – IGMP – INTERNET GROUP MULTICAST PROTOCOL
3 – GGP – GATEWAY-GATEWAY PROTOCOL
6 – TCP – TRANSMISSION CONTROL PROTOCOL
17 – UDP – USER DATAGRAMA PROTOCOL

continua…