Escolar Documentos
Profissional Documentos
Cultura Documentos
Slides 20: TCP/IP em Winsocks 2. API do Windows para programar utilizando o protocolo TCP/IP
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.
Antes de Programar
Uma vez entendidos os conceitos bsicos e decidida a biblioteca, devemos entender as variveis e funes que sero utilizadas.
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;
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(...).
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: