FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 754.092 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 14-09-2006, 15:17   #1 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão Duvidas em Sockets

Boa tarde pessoal,

Gostaria de saber como funciona os detalhas de socket para programação como fazer conexões, não precisar ser nada na pratica em alguma linguagem de programação mas se tiver melhor.

Tambem gostaria de saber como faz uma conexão Tcp/Ip ?
Como enviar uma string por exemplo em uma porta ?

Coisas desses genero,

obrigado desde já.
RportM está offline   Responder com Quote
Antigo 14-09-2006, 15:20   #2 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

Caro amigo RportM...

vc conhece C ou C++ ?

Se simm, poderei com calma explicar todo o funcionamente e a utilizar os sockets !

:mrgreen:
FabianoTraple está offline   Responder com Quote
Antigo 15-09-2006, 7:57   #3 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

Tenho conhecimento em C
RportM está offline   Responder com Quote
Antigo 15-09-2006, 9:49   #4 (permalink)
The Doug
Super Participante
 
Avatar de The Doug
 
Registrado em: Apr 2004
Mensagens: 897
Reputação: 18 The Doug possui ótimo potencialThe Doug possui ótimo potencial
Padrão

pega o tutorial do beej's. Depois eu procuro e posto aqui......
__________________
Visitem meu site:

www.infotalkers.com
The Doug está offline   Responder com Quote
Antigo 15-09-2006, 12:41   #5 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

RportM...

Posso ajudar vc a fazer passo a passo um pequeno programa de chat como exemplo, mas antes defina algum detalhes antes como:

Vc pretende fazer em linux ou windows?
Qual compilador vc usa?
Tem algum problema se vizermos em C ?

OBS: Existem algumas peculiaridades conforme o sistema operacional usado ou a lingaugem...

:mrgreen:
__________________
umbrsuporte@hotmail.com
FabianoTraple está offline   Responder com Quote
Antigo 15-09-2006, 13:13   #6 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

Pretendo fazer em Windows, eu uso Dev C++, realmente eu prefiro fazer em C tenho uma certa afinidade com a linguagem
RportM está offline   Responder com Quote
Antigo 15-09-2006, 13:33   #7 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

Beleza ...

Teremos que desenvolver dois programas, um chamado "terminal.exe" e outro "servidor.exe"...

Achei um códigos antigos meus vou postar para vc, depois poderemos estudar eles com calma !

Este é o código do programa servidor:

Código:
#include <stdio.h> #include <winsock2.h> int CriaNovoSocket( SOCKET *L_SocketEntrada ); // porta em que estaremos escutando int main (void) { printf( "Servidor teste\n"); printf( "--------------------------------------------------------------------------------\n"); struct sockaddr_in L_EnderecoRemoto; //-----> Verificação da versão da winsock WORD L_Versao; WSADATA wsaData; L_Versao = MAKEWORD( 2, 2); int L_Erro = WSAStartup( L_Versao, &wsaData); if( L_Erro != 0 ) { printf("Não foi possível encontrar a dll winsock!\n"); return(-1); } if( LOBYTE( wsaData.wVersion) < 2 || HIBYTE( wsaData.wVersion) < 2) { printf("A dll winsock é muito antiga!\n"); return(-1); } //-----> Criando socket SOCKET L_SocketEntrada; SOCKET L_SocketSaida; CriaNovoSocket( &L_SocketEntrada ); int L_MaiorSocket = L_SocketEntrada; //-----> Inicia laço do monitor de serviços de comunicação printf("Monitor de servicos ativo...\n\n"); struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; // Monta set para verificação de conexões inativas fd_set L_SetAtivos; fd_set L_SetAtivosTemp; FD_ZERO(&L_SetAtivos); FD_SET( L_SocketEntrada, &L_SetAtivos); int L_NumeroBytesRecebidos, L_NumeroBytesEnviados; do { // Verifica envio, recebimento e estatus da conexão FD_ZERO(&L_SetAtivosTemp); L_SetAtivosTemp = L_SetAtivos; if( select( L_MaiorSocket+1, &L_SetAtivosTemp, NULL, NULL, &timeout ) == -1 ) { printf("Erro da funcao SELECT ! Pressione uma tecla para sair...\n\n"); getchar(); return(-1); } int L_NumeroSockret; for( L_NumeroSockret = 0; L_NumeroSockret <= L_MaiorSocket; L_NumeroSockret++) { if( FD_ISSET( L_NumeroSockret, &L_SetAtivosTemp) != 0 ) { if ( L_NumeroSockret == L_SocketEntrada ) { // trata de nova entradas int addrlen = sizeof (L_EnderecoRemoto); if( ( L_SocketSaida = accept( L_SocketEntrada, (struct sockaddr*)&L_EnderecoRemoto, &addrlen)) == -1) { printf("Erro ao aceitar a conexão!\n\n"); } else { FD_SET( L_SocketSaida, &L_SetAtivos); if( L_SocketSaida > L_MaiorSocket ) { L_MaiorSocket = L_SocketSaida; } printf ("Servidor : nova conexão de %s no socket %d\n", inet_ntoa (L_EnderecoRemoto.sin_addr), L_SocketSaida); } } else { // trata do envio e recebimento de pacotes char L_Mensagem[1024]; memset( L_Mensagem, '\0', 1024); L_NumeroBytesRecebidos = recv( L_NumeroSockret, L_Mensagem, 512, 0 ); if( L_NumeroBytesRecebidos > 0 ) { printf("Recebeu: [%d]: %s \n", L_NumeroSockret, L_Mensagem); // Mensagem de retorno if( strlen(L_Mensagem) > 0 ) { L_NumeroBytesEnviados = send( L_NumeroSockret, "OK", 2, 0 ); if( L_NumeroBytesEnviados != 2 ) { printf("Erro ao retornar mensagem de verificacao do socket[%d]\n", L_NumeroSockret); } } else { printf("Falha ao receber: [%d]: %s \n", L_NumeroSockret, L_Mensagem); } } else { printf("Fechou a conexão do socket [%d] \n", L_NumeroSockret); closesocket(L_NumeroSockret); FD_CLR( L_NumeroSockret, &L_SetAtivos); break; } } } } } while(TRUE); return(0); } int CriaNovoSocket( SOCKET *L_SocketEntrada ) { struct sockaddr_in L_Endereco; L_Endereco.sin_family = AF_INET; L_Endereco.sin_addr.s_addr = INADDR_ANY; L_Endereco.sin_port = htons(27015); int i; for(i=0;i<8;i++) { L_Endereco.sin_zero[i] = 0; } if(( *L_SocketEntrada = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0) { printf("Erro ao criar o socket!\n"); return(-1); } //char yes=1; // necessário para função setsockopt() SO_REUSEADDR //if (setsockopt( *L_SocketEntrada, SOL_SOCKET, SO_REUSEADDR, &yes, 2) == -1) //{ // printf("Erro: setsockopt"); // exit (1); //} //-----> Escutando canal de comunicação if( bind( *L_SocketEntrada, (struct sockaddr*)&L_Endereco, sizeof(L_Endereco)) == SOCKET_ERROR) { printf("Erro de bind!"); } //-----> Listando canal de comunicação if( listen( *L_SocketEntrada, 10 ) == SOCKET_ERROR) { printf("Erro de listen!\n"); } }
Não esqueça de acidionar no projeto do servidor a biblioteca socket, procure ela dentro do direorio LIB na pasta DEVCPP...

Sem adicionar a biblioteca o exemplo não compila...

Em seguida esitou postando o código do terminal....

:mrgreen:
__________________
umbrsuporte@hotmail.com
FabianoTraple está offline   Responder com Quote
Antigo 15-09-2006, 13:36   #8 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

Este é o código para fazer o terminal...

Código:
#include <stdio.h> #include <winsock2.h> // porta em que estaremos escutando int main (void) { printf( "Terminal teste\n"); printf( "--------------------------------------------------------------------------------\n"); struct sockaddr_in L_Endereco; L_Endereco.sin_family = AF_INET; L_Endereco.sin_addr.s_addr = inet_addr("192.168.200.60"); //L_Endereco.sin_addr.s_addr = inet_addr("200.138.216.49"); L_Endereco.sin_port = htons(27015); //-----> Verificação da versão da winsock WORD L_Versao; WSADATA wsaData; L_Versao = MAKEWORD( 2, 2); int L_Erro = WSAStartup( L_Versao, &wsaData); if( L_Erro != 0 ) { printf("Não foi possível encontrar a dll winsock!\n"); return(-1); } if( LOBYTE( wsaData.wVersion) < 2 || HIBYTE( wsaData.wVersion) < 2) { printf("A dll winsock é muito antiga!\n"); return(-1); } //-----> Criando socket SOCKET L_Socket; if(( L_Socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0) { printf("Erro ao criar o socket!\n"); return(-1); } //----->Conectando-se printf("Conectando-se ao servidor...\n\n"); if( connect( L_Socket, (struct sockaddr*)&L_Endereco, sizeof(L_Endereco)) == 0) { printf("terminal conectado ao servidor com sucesso!\n\n"); } else { printf("Não foi possível conectar-se ao servidor!\n\n"); return(-1); } //-----> Inicia laço do envio e recebimento printf("Monitor de envio e recebimento ativo...\n\n"); //-----> adiciona a socket a lista de verificação fd_set L_Envio; fd_set L_EnvioTemp; FD_ZERO(&L_Envio); FD_SET( L_Socket , &L_Envio); int L_ConMen = 0, L_QuaPerPac = 0; int L_NumeroBytesEnviados; int L_NumeroBytesRecebidos; struct timeval timeout; timeout.tv_sec = 10; timeout.tv_usec = 0; char L_Teste[11]; char L_Mensagem[1024], // Mensagem de envio L_ConRetorno[3]; // Mensagem de confirmação de retorno do { FD_ZERO(&L_EnvioTemp); L_EnvioTemp = L_Envio; if( select( 0, NULL, &L_EnvioTemp, NULL, &timeout) != -1 ) { memset( L_Mensagem, '\0', 1024); L_ConMen++; itoa( L_ConMen, L_Teste, 10); strcpy( L_Mensagem, L_Teste ); int L_NumeroBytesEnviados = 0; do { L_NumeroBytesEnviados = send( L_Socket, L_Mensagem, 8, 0 ); if( L_NumeroBytesEnviados == 8 ) { printf("Envio %d , %s...", L_NumeroBytesEnviados, L_Teste); // Espera retorno para confirmação FD_ZERO(&L_EnvioTemp); L_EnvioTemp = L_Envio; if( select( 0, &L_EnvioTemp, NULL, NULL, &timeout) != -1 ) { memset( L_ConRetorno, '\0', 3); L_NumeroBytesRecebidos = recv( L_Socket, L_ConRetorno, 2, 0 ); if( L_NumeroBytesRecebidos > 0 && L_ConRetorno[0] == 'O' && L_ConRetorno[1] == 'K' ) { printf("%s\n", L_ConRetorno); break; } } else { printf("\nErro de envio %d , %s \n", L_NumeroBytesEnviados, L_Teste); } } else { L_QuaPerPac++; printf(" [%d] Perda de pacote! Pressione uma tecla..." , L_QuaPerPac); getchar(); } } while(TRUE); } if( L_ConMen == 100 ) { closesocket(L_Socket); break; } } while(TRUE); printf("\n100 mensagens enviadas. Pressione uma tecla para sair...\n"); getchar(); return(0); }
Com essas funções como base poderemos desenvolver qualquer coisa que precise de comunição , inclusive jogos !

Depois dizem que a gente não ajuda !

heheheheh

:mrgreen:
FabianoTraple está offline   Responder com Quote
Antigo 15-09-2006, 14:15   #9 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

FabianoTraple

Muito obrigado mesmo pela sua ajuda , não sei nem como agradecer.......
RportM está offline   Responder com Quote
Antigo 15-09-2006, 14:26   #10 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

Caro colega RportM...

Se vc tiver alguma dúvida sobre os comandos ou a lógica do prorama, estamos ai...
Gostaria de ver o resultado depois, se possível !

:mrgreen:
__________________
umbrsuporte@hotmail.com
FabianoTraple está offline   Responder com Quote
Antigo 15-09-2006, 15:29   #11 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

Te mando sim minha duvidas pq sei que terei muitas..........rsrsrs
Qnd tiver o resultado te mando sim, muito obrigado novamente
RportM está offline   Responder com Quote
Antigo 21-09-2006, 12:17   #12 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

Primeiro problema qnd compilo aparece um monte de msg de erro todas com problemas de linkagem

[Linker error] undefined reference to ...

o que pode ser?
RportM está offline   Responder com Quote
Antigo 21-09-2006, 12:26   #13 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

RportM ...

Vc tem que adicionar a biblioteca ao projetos, para compilar junto...

Dentro da pasta DEVCPP tem uma pasta LIB, procure uma biblioteca chamada winsock.lib, não tenho certeza se é esse o nome exato !

Clique com o botão direito sobre o projeto e vá nas propriedades e adicione em bibliotecas extras...

É meio complicadinho, tenta achar ai !

Não tenho mais o DEVCPP instalado aqui para te passar os passos corretamente...

:mrgreen:
__________________
umbrsuporte@hotmail.com
FabianoTraple está offline   Responder com Quote
Antigo 21-09-2006, 12:59   #14 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

FabianoTraple

Consegui compilar, vc tem algum documento explicando cada função?
RportM está offline   Responder com Quote
Antigo 21-09-2006, 13:04   #15 (permalink)
xxtodinhoxx
Membro Senior
 
Registrado em: Sep 2006
Mensagens: 188
Reputação: 11 xxtodinhoxx está indo no caminho certo
Padrão

FabianoTraple
Eu olhando assim sem sacar nada fica um pouco dificil, vc teria algum meio de eu estar estudando o que é compilação,as formas, essas coisas mais,pq é akilo q te disse eu ñ sei nadinha,nenhuma linha de comando!
Para fazer esses códigos vc faz com algum programa?Espero q tenha entendido a perg!
Vlew T+
Edit:Explicando: Tipo quero um programa q toda vez clicar em send ele mande uma msg p o ip xxx.xxx.xxx.xx , para eu fazer isso eu vou digitando ou tem nos programas (C,C++,Delphi...) Opções q me ajudam a fazer isso! Descubri um exeplo melhor: os programas que vc usa para programar são tipo um frontpage da vida?! Vc tem algumas opções q vc clica e ele joga a linha de comando,e caso queira uma coisa mais especifica vc escreve. Ou vc tem q escrever tdo de acordo c a logica escolhida!?Espero q tenha entendido, desculpe o tamanho do texto!
__________________
Chris I LOVE YOU!

"É melhor queimar do que apagar aos poucos." sml0221 :!: kURT cObAIN
xxtodinhoxx está offline   Responder com Quote
Antigo 21-09-2006, 13:51   #16 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

xxtodinhoxx...

Na verdade com esse código acima vc pode fazer qualquer coisa relacionada a rede. Nã existe limite de aplicação, porém, vc terá que ao menos conhecer um pouco sobre programação em C, para fazer isso tente encontrar algum amigo que possa auxilia-lo no início ou pesquise no google "apostila+c", vc encontrará farto material, com calma vc aprende tudo aos poucos, vai depender de vc.

:mrgreen:

RportM...

Vc consegue encontrar no google farta documentação sobre sockets, é só escrever a palavra socket+comando que vc deseja...

Se tiver dúvida sobre algum comando ou a estrutura é só postar aqui que ei irei explicar !

Correção do código:

Em ambos os programas altere a declaração da estrutura timeout para dentro do laço "do while", como abaixo:

Código:
char L_Teste[11]; char L_Mensagem[1024], // Mensagem de envio L_ConRetorno[3]; // Mensagem de confirmação de retorno do { timeout.tv_sec = 1; timeout.tv_usec = 0;
Isso fará com que o processador não utilize 100% do processador.
FabianoTraple está offline   Responder com Quote
Antigo 21-09-2006, 15:03   #17 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

Para a galera que esta acompanhando.....

wendell.cefetce.br/wendell/winsock.doc
RportM está offline   Responder com Quote
Antigo 21-09-2006, 16:03   #18 (permalink)
xxtodinhoxx
Membro Senior
 
Registrado em: Sep 2006
Mensagens: 188
Reputação: 11 xxtodinhoxx está indo no caminho certo
Padrão

FabianoTraple
De acordo com meu interesse, entrei num site a algum tempo atrás e baixei todas as apostilas, só to esperando comprar o pc,p começar a estudá-las! Dá uma entrada no site e ve se o conteudo é bom das apostilas fazendo um favor www.apostilando.com
Eu vou ler a de lógica e dpois vou começar a ler a de C intaum para tentar adquirir conhecimentos!

Obs: Dxa eu te perg. tem algum problema se vc me der seu e-mail?Se puder manda um mp com seu e-mail,se ñ tdo bem!
__________________
Chris I LOVE YOU!

"É melhor queimar do que apagar aos poucos." sml0221 :!: kURT cObAIN
xxtodinhoxx está offline   Responder com Quote
Antigo 21-09-2006, 16:22   #19 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

xxtodinhoxx ...

Eu tenho msn só para receber email e só olho no final de semana, é muito mais fácil vc encontrar eu no forum.
E aqui no forum mais de uma pessoa poderá te ajudar e se beneficiar da mesma dúvida.

:mrgreen:
__________________
umbrsuporte@hotmail.com
FabianoTraple está offline   Responder com Quote
Antigo 22-09-2006, 7:02   #20 (permalink)
xxtodinhoxx
Membro Senior
 
Registrado em: Sep 2006
Mensagens: 188
Reputação: 11 xxtodinhoxx está indo no caminho certo
Padrão

Ok...Ae vc sabe algum site onde baixo os programas completos para programar?
__________________
Chris I LOVE YOU!

"É melhor queimar do que apagar aos poucos." sml0221 :!: kURT cObAIN
xxtodinhoxx está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 6:48.