Vous êtes sur la page 1sur 81

Engenharia Eltrica Eletrnica

Slides 20: TCP/IP em Winsocks 2. API do Windows para programar utilizando o protocolo TCP/IP

Prof. Jean Marcelo SIMO

Engenharia Eltrica Eletrnica

Tutorial: Programao C++ TCP/IP com API winsocks 2 Aluno: Marcelo Hiroshi Sugita Prof. Fbio Kurt Schneider 2011
Prof. Jean Marcelo SIMO

Objetivo
o

Apresentar conceitos de comunicao entre computadores em redes. Explicar e demonstrar a utilizao de um dos protocolos que possibilita a troca de dados entre computadores. No tutorial apresentaremos o protocolo TCP/IP.

Explicaes Iniciais
Neste tutorial, utilizaremos um programa exemplo elaborado por Andr de Castilho Costa Pinto, em 2007, ento aluno dessa matria e estagirio em projeto do Professor da disciplina. Explicaremos os conceitos necessrios para a programao, bem como as funes e variveis utilizadas na biblioteca winsocks 2.

Conceitos Necessrios
Servidor e Cliente Endereo IP Protocolos de Transporte Porta Socket

Servidor e Cliente
Toda comunicao depende de dois participantes: quem envia dados e quem os recebe. Servidor quem recebe as conexes, ou seja fica a espera de novas conexes. Cliente quem se conecta a um servidor. Isto, porm, no implica que um ir apenas enviar dados e o outro apenas receber.

Servidor e Cliente

Servidor e Cliente
No programa exemplo, o cliente se conecta ao servidor, e envia dados (strings ou structs) ao servidor. importante frisar que h diversas maneiras que se pode programar, ficando a escolha do programador optar pela melhor escolha. (Cliente-Servidor; Servidor multi-cliente...)

Servidor e Cliente
H tambm a possibilidade de utilizar o mesmo computador como cliente e servidor, seja para motivos de testes ou no. O computador se refere a si mesmo utilizando um endereo chamado localhost ou 127.0.0.1 Utilizando o prompt de comando do windows podemos testar esta conexo.

Conceitos Necessrios
Servidor e Cliente Endereo IP Protocolos de Transporte Porta Socket

Endereo IP
O endereo IP (Internet Protocol) o endereo que indica o local de uma determinada mquina numa rede, ou seja, como uma mquina enxerga a outra. Esse endereo utilizado para estabelecer uma conexo remota entre computadores.

Endereo IP
O protocolo de rede mais utilizado atualmente o IPv4 que suporta aproximadamente 4 bilhes (4x109) de endereos Ele est sendo substituido gradativamente pelo IPv6 que suporta cerca de 3,4x1038 endereos

Endereo IP

Conceitos Necessrios
Servidor e Cliente Endereo IP Protocolos de Transporte Porta Socket

Protocolos de Transporte
De forma geral o modo como sero trocados os dados entre os computadores em uma rede.

Os mais difundidos so TCP e UDP TCP (Transmission Control Protocol) UDP (User Datagram Protocol).

Protocolos de Transporte
O TCP utilizado em protocolos de alto nvel como HTTP e FTP. Nele que se faz a maior parte de transferncia de dados na internet. Ele mais seguro pois verifica se a seqncia de dados enviada foi de forma correta, na seqncia apropriada e sem erros. Porm, isso o torna mais lento que o UDP.

Protocolos de Transporte
TCP exemplo: E-mail

Protocolos de Transporte
O UDP utilizado em situaes em que a velocidade se sobrepe a qualidade (os dados chegarem certo) Ele tambm permite a um nico cliente enviar o mesmo pacote de dados para vrios outros. Apesar de ser mais rpido, ele no d a garantia que os pacotes de dados chegaram ao destinatrio, se chegaram na ordem correta, ou se dados foram perdidos.

Protocolos de Transporte
UDP - exemplo : aplicaes em streaming, como vdeos ao vivo, chamadas de voz.

Conceitos Necessrios
Servidor e Cliente Endereo IP Protocolos de Transporte Porta Socket

Porta
Em um computador (endereo IP, para uma rede) h vrios processos (programas) sendo executados em um momento. Quando um pacote de dados recebido, a porta que direciona tal pacote de dados ao processo certo. A porta , ento, um nmero que associa os pacotes recebidos a um dado processo em execuo numa mquina

Porta

Conceitos Necessrios
Servidor e Cliente Endereo IP Protocolos de Transporte Porta Socket

Socket
O socket a combinao do endereo IP e a porta de determinado processo executado no endereo IP. O socket o necessrio para se transmitir dados atravs dos protocolos de transporte (TCP e UDP).

Socket

E como se programa?
Programa-se via API do Windows

A API (Application Programming Interface) constitui-se de em uma biblioteca de funes que permite escrever cdigos que rodem em Windows

A API inclui uma biblioteca que contm as funes que gerenciam e utilizam sockets para estabelecer conexes ou enviar pacotes de dados.

A biblioteca em questo a ws2_32.lib, abreviao de winsocks2, para plataformas win32.

Antes de Programar
Uma vez entendidos os conceitos bsicos e decidida a biblioteca, devemos entender as variveis e funes que sero utilizadas.

Classes, Variveis e Estruturas Bsicas Funes

API - Classes, Variveis e Estruturas Bsicas


sockaddr_in

estrutura derivada da sockaddr especializada para trabalhar com o protocolo TCP/IP.

sin_family define o protocolo de transporte, como no caso TCP ou UDP o utilizado AF_INET; sin_port o nmero da porta a ser utilizada nesse processo; sin_addr o endereo IP; sin_zero no utilizado;

API - Classes, Variveis e Estruturas Bsicas


SOCKET
estrutura que receber o socket criado pela funo socket(...). Posteriormente atravs da funo bind(...) receber um endereo IP e uma porta. Ser utilizada em quase todas as funes de troca de dados.

WSADATA
estrutura que contm os detalhes da implementao de socket no Windows

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
WSAStartup (...)
A funo WSAStartup(...) inicializa o winsocks (implementao de sockets do Windows) e verifica se o computador suporta a verso do winsocks a ser utilizada.
No primeiro parmetro deve ser fornecida a verso do winsocks a ser utilizada. Para se utilizar a verso 2.2 (ultima) feito: MAKEWORD(2,2) No segundo parmetro enviado um ponteiro para uma estrutura WSADATA, a qual receber os detalhes da implementao do socket. A funo retornar 0 se no ocorrer nenhum erro na inicializao. Caso contrario, para cada erro ele retornar um valor diferente.

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
WSACleanup (...)
A funo WSACleanup(...) finaliza o uso do winsocks

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
socket (...)
A funo socket(...) criar um socket para determinado tipo de protocolo de transferncia. A funo retornar o socket criado, que ser necessrio para maioria das funes do tutorial.
No primeiro parmetro deve ser fornecido o tipo de endereo utilizado. Para protocolo TCP ou UDP utilizamos AF_INET No segundo parmetro define-se o tipo de socket a ser criado. SOCK_STREAM para criar um socket TCP, e SOCK_DGRAM para um socket UDP. No ultimo parmetro define-se o protocolo a ser utilizado no socket. IPPROTO_TCP para utilizar o protocolo TCP.

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
closesocket(...)
A funo closesocket(...) utilizada para encerrar um socket criado pela funo socket(...). Todos os sockets criados pela funo devem ser encerrados utilizando o closesocket(...).

O nico parmetro a ser enviado o prprio socket a ser encerrado.

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
bind (...)
A funo bind(...) atribui a um socket um endereo IP e uma porta que foram anteriormente definidas numa estrutura sockaddr_in. Essa funo s necessria na inicializao do socket do servidor.
No primeiro parmetro coloca-se o socket a receber o endereo IP e a porta. No segundo parmetro coloca-se o sockaddr_in criado anteriormente. O nico detalhe que se faz necessrio fazer uma converso para sockaddr. reinterpret_cast < SOCKADDR* > ( &name ) No ultimo parmetro coloca-se o tamanho da estrutura sockaddr. sizeof ( meu_end )

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
listen (...)
A funo listen(...) coloca o socket (j configurado) em estado de escuta. Dessa forma, ele pode receber a conexo de outro socket (de outra mquina) a fim de estabelecer uma comunicao. Essa funo s necessria no servidor.
O primeiro parmetro o socket que ser colocado em estado de escuta. Ou seja, o socket do seu prprio programa. O outro parmetro a quantidade de sockets que podero se conectar ao seu sistema.

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
accept(...)
A funo accept(...) utilizada aps um socket ser colocada em estado de escuta e h uma conexo pendente nele. Essa funo aceita a conexo feita por um outro computador (socket remoto) e retorna o socket com as informaes do computador remoto.
O primeiro parmetro o socket que est em estado de escuta. O segundo parmetro um ponteiro para uma estrutura addr_in, contendo as informaes do computador remoto. O ultimo parmetro o tamanho da estrutura addr_in presente no segundo parmetro dessa funo

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
connect (...)
A funo connect() o casal das funes listen(...) e accept(). Isso porque enquanto as duas ocorrem em um lado da conexo (servidor), a connect(...) acontece do outro lado (cliente). atravs dessa funo que um computador se conecta a outro. Porm, necessrio saber o endereo IP e a porta de acesso para o outro computador.
O primeiro parmetro o socket criado atravs da funo socket(...) . Apesar de ser o socket criado na mquina cliente, no necessrio fazer o bind(...). O segundo parmetro o sockaddr_in que deve ser criado e possuir o endereo IP e porta do servidor ao qual se quer conectar. O ultimo parmetro o tamanho da estrutura presente no segundo parmetro dessa funo.

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
send (...)
A funo send() utilizada para enviar os dados de um computador ao outro. o casal da funo recv(...). A funo send(...) pode ser utilizada tanto pelo cliente como pelo servidor, o detalhe que para enviar algo, o outro precisa receber.
O primeiro parmetro o socket que contm as informaes do computador remoto a que se deseja enviar os dados. O segundo parmetro um ponteiro do tipo char (ou seja, qualquer dado que ser enviado deve ser anteriormente convertido em chars) cujo contedo ser o que ser mandado ao outro computador. O terceiro parmetro um inteiro com o tamanho do buffer a ser enviado. O ultimo parmetro o modo como a funo se comporta, e dificilmente ser utilizado um valor diferente de 0.

API - Funes
WSAStartup (...) WSACleanup (...) socket (...) closesocket (...) bind (...) listen (...) accept (...) connect (...) send (...) recv (...)

API - Funes
recv (...)
A funo recv(...) o par da funo send(...). Para cada send(...) deve haver um recv(...). Essa funo recebe no buffer toda informao procedente do socket apontado.
O primeiro parmetro o socket que contm as informaes do computador remoto do qual se deseja receber os dados. O segundo parmetro um ponteiro do tipo char que receber o contedo procedente do outro computador. O terceiro parmetro um inteiro com o tamanho do buffer recebido. O ultimo parmetro o modo como a funo se comporta, e dificilmente ser utilizado um valor diferente de 0.

A Programao
necessrio primeiramente acrescentar ao projeto a biblioteca que responsvel pelas funes que gerenciam os sockets e, assim, a rede.

Dessa forma, j estamos aptos a utilizar todas as funes que foram explicadas nesse tutorial, a fim de se estabelecer uma conexo entre computadores.

A Programao
importante salientar que necessrio programar tanto a parte do servidor quanto a do cliente, sendo duas partes distintas e especificas do cdigo. A partir desse momento, mostraremos passo a passo como desenvolver um programa simples como o programa exemplo.

A Programao - Servidor
Passos a serem feitos no Servidor:
Inicializar a biblioteca Criar o socket em meu computador que aguardar as conexes dos outros computadores Amarrar o socket criado com o endereo IP do meu computador Entrar em modo de espera, aguardando a conexo de outro computador Ao receber a conexo, guardar o endereo IP desse computador e, - esperar novas conexes ou entrar no loop de troca de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Inicializar a biblioteca:

A Programao - Servidor
Passos a serem feitos no Servidor:
Inicializar a biblioteca Criar o socket em meu computador que aguardar as conexes dos outros computadores Amarrar o socket criado com o endereo IP do meu computador Entrar em modo de espera, aguardando a conexo de outro computador Ao receber a conexo, guardar o endereo IP desse computador e, - esperar novas conexes ou entrar no loop de troca de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Criar o socket :

A Programao - Servidor
Passos a serem feitos no Servidor:
Inicializar a biblioteca Criar o socket em meu computador que aguardar as conexes dos outros computadores Amarrar o socket criado com o endereo IP do meu computador Entrar em modo de espera, aguardando a conexo de outro computador Ao receber a conexo, guardar o endereo IP desse computador e, - esperar novas conexes ou entrar no loop de troca de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Amarrar o socket :

A Programao - Servidor
Passos a serem feitos no Servidor:
Inicializar a biblioteca Criar o socket em meu computador que aguardar as conexes dos outros computadores Amarrar o socket criado com o endereo IP do meu computador Entrar em modo de espera, aguardando a conexo de outro computador Ao receber a conexo, guardar o endereo IP desse computador e, - esperar novas conexes ou entrar no loop de troca de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Modo de espera :

A Programao - Servidor
Passos a serem feitos no Servidor:
Inicializar a biblioteca Criar o socket em meu computador que aguardar as conexes dos outros computadores Amarrar o socket criado com o endereo IP do meu computador Entrar em modo de espera, aguardando a conexo de outro computador Ao receber a conexo, guardar o endereo IP desse computador e, - esperar novas conexes ou entrar no loop de troca de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Receber Conexo:

A Programao - Servidor
Loop de troca de dados:

A Programao - Servidor
Passos a serem feitos no Servidor:
Inicializar a biblioteca Criar o socket em meu computador que aguardar as conexes dos outros computadores Amarrar o socket criado com o endereo IP do meu computador Entrar em modo de espera, aguardando a conexo de outro computador Ao receber a conexo, guardar o endereo IP desse computador e, - esperar novas conexes ou entrar no loop de troca de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Finalizar:

A Programao - Cliente
Passos a serem feitos no Cliente:
Inicializar a biblioteca Criar o socket em meu computador que ir receber o endereo IP do servidor Entrar com o IP do servidor, e tentar a conexo Estabelecida a conexo (servidor aceitar), entrar no loop de envio de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Inicializar a biblioteca:

A Programao - Cliente
Passos a serem feitos no Cliente:
Inicializar a biblioteca Criar o socket em meu computador que ir receber o endereo IP do servidor Entrar com o IP do servidor, e tentar a conexo Estabelecida a conexo (servidor aceitar), entrar no loop de envio de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Criar socket:

A Programao - Cliente
Passos a serem feitos no Cliente:
Inicializar a biblioteca Criar o socket em meu computador que ir receber o endereo IP do servidor Entrar com o IP do servidor, e tentar a conexo Estabelecida a conexo (servidor aceitar), entrar no loop de envio de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Conectar com servidor:

A Programao - Cliente
Passos a serem feitos no Cliente:
Inicializar a biblioteca Criar o socket em meu computador que ir receber o endereo IP do servidor Entrar com o IP do servidor, e tentar a conexo Estabelecida a conexo (servidor aceitar), entrar no loop de envio de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Loop envio de dados:

A Programao - Cliente
Passos a serem feitos no Cliente:
Inicializar a biblioteca Criar o socket em meu computador que ir receber o endereo IP do servidor Entrar com o IP do servidor, e tentar a conexo Estabelecida a conexo (servidor aceitar), entrar no loop de envio de dados. Aps terminar a troca, fechar sockets e finalizar a biblioteca

A Programao - Servidor
Finalizar:

Envio e Recebimento de dados


J foi explicado anteriormente que os dados so trocados apenas em formatos de caracteres (ou seja bytes) Mostraremos essa parte no cdigo do programa exemplo

Envio e Recebimento de dados

Envio e Recebimento de dados


H vrias formas de controlar o envio e recebimento de dados. No exemplo dado, a cada troca de informaes, o cliente/servidor enviava uma pequena string confirmando o recebimento No h uma maneira correta de se fazer isso, variando de programador para programador

Envio e Recebimento de dados

Envio e Recebimento de dados


No exemplo dado, h tambm a troca de classes ou strings. Para classes, h um numero de bytes recebidos que diferencia de strings (muitos bytes); essa alternativa pode causar um bug, porm foi a soluo encontrada pelo programador. Para diferenciar as classes, o valor enviado nos bytes recebidos era diferente.

Envio e Recebimento de dados

Referncias Bibliogrficas e Materiais Adicionais


pessoal.utfpr.edu.br/jeansimao Slides elaborados por Andr de

Castilho Costa Pinto, disponveis no site do Professor Jean Simo


http://msdn.microsoft.com/enus/library/ms740673(v=vs.85).aspx