Jump to content

Recommended Posts

Posted

pessoal eu vou iniciar o estudo dos servers e queria que me ajudassem a perceber melhor os ips...

como eu farei para ligar c++ a um server?

ou como, em c++ criar um server?

estou ainda muito confuso nessa parte, onde vou buscar o ip?

como vou fazer comunicar o programa com um programa de outro computador com um server c++?

objetivo:

criar um jogo multiplayer online

obrigado,seuqram...

Posted

Tens que utilizar sockets.

Depois de connectado por sockets, vais buscar o IP muito facilmente

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

Tens que utilizar sockets.

Depois de connectado por sockets, vais buscar o IP muito facilmente

Pikax podes indicar algum site ou algo que nos ajude a trabalhar com coisas deste genero? Tipo, como o seuqram disse, os ip's, mas também trabalhar com os protocolos udp, tcp e esse tipo de programação?

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

Pikax podes indicar algum site ou algo que nos ajude a trabalhar com coisas deste genero? Tipo, como o seuqram disse, os ip's, mas também trabalhar com os protocolos udp, tcp e esse tipo de programação?

http://beej.us/guide/bgnet/output/html/multipage/index.html

Para saber o IP de um cliente que esteja connectado, tens algumas formas para o fazer

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

conforme, em linux e' uma e em windows e' outra.

Podes fazer com qualquer IDE com o compilador gcc(minGW).

Este codigo esta feito para funcionar em linux, basta fazer algumas alteracoes faceis para ele funcionar em windows, isto e' um cliente - servidor que fiz num teste.

cliente

/****************************************
|  1º TESTE DE AVALIAçãO      17/11/2011
|       Redes de Computadores
|  Nome:                        Nr:
|  Turma:
|         
|     Aluno:  
|    
|     Professor:  
|
|     Avaliação:  
|
|   Escola Secundária D. Afonso Sanches
|   Curso Profissional de Programação
|    e Gestão de Sistemas Informáticos
*****************************************/
//     CLIENTE

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <errno.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/select.h>
#define NR_CARACTERES 400
#define PORTA 7000


int main(){
    struct hostent *hostip;
    int sock;
    char mensagem[NR_CARACTERES];
    unsigned int tamanho;
    struct sockaddr_in sockaddr;
    int nrOrdem=89;

    /* Insira um comentário apropriado */
    sock=socket(AF_INET, SOCK_STREAM, 0);
    if (sock==-1)
        perror("Socket");
        

    /* Insira um comentário apropriado */
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = INADDR_ANY;
    sockaddr.sin_port = htons(PORTA);
        

    /* Insira um comentário apropriado */
    if ((hostip = gethostbyname("localhost")) == NULL) {
           puts("Error resolving hostname..");
           exit(1);
    }
        
    // Preparação do connect() -- NÃO ALTERAR!!!!       
    memcpy(&sockaddr.sin_addr, hostip->h_addr_list[0], hostip->h_length);
    
    if (connect(sock,(struct sockaddr *) &sockaddr,sizeof(sockaddr)) < 0) 
        error("ERROR connecting");
    
     
    read(sock,mensagem,NR_CARACTERES);
    printf("sms recebida= %s",mensagem);
    if(mensagem[0]=='a')
    {
    	read(sock,mensagem,NR_CARACTERES);
    	
    	printf("\nsms recebida= %s",mensagem);
    	
    	printf("\nEscreva a mensagem:");
    	gets(mensagem);
    	write(sock,mensagem,NR_CARACTERES);
    	
    	read(sock,mensagem,NR_CARACTERES);
    	printf("\nsms recebida= %s",mensagem);  
    	
    	printf("\nEscreva a mensagem:");
    	gets(mensagem);
    	write(sock,mensagem,NR_CARACTERES);
    }
    else
    {
    	printf("\nEscreva a mensagem:");
    	gets(mensagem);
    	write(sock,mensagem,NR_CARACTERES);   
    	
    	read(sock,mensagem,NR_CARACTERES);
    	printf("\nsms recebida= %s",mensagem);  
    	
    	printf("\nEscreva a mensagem:");
    	gets(mensagem);
    	write(sock,mensagem,NR_CARACTERES);
    	
    	read(sock,mensagem,NR_CARACTERES);
    	printf("\nsms recebida= %s\n",mensagem);   
    }
    
    close(sock);
    
    return 0;
}

server

/****************************************
|  1º TESTE DE AVALIAçãO      17/11/2011
|       Redes de Computadores
|  Nome:                        Nr:
|  Turma:
|         
|     Aluno: Carlos David Carvalho Rodrigues 
|    
|     Professor: Nuno Pereira  
|
|     Avaliação:  
|
|   Escola Secundária D. Afonso Sanches
|   Curso Profissional de Programação
|    e Gestão de Sistemas Informáticos
*****************************************/
//     SERVIDOR
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <errno.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/select.h>
#define TAM 400
#define PORTA 7000

int main() {

    int DSCR;
    unsigned int len;
    int new_DSR;
    int new_DSR2;
    char mensagem[TAM];
    /* Comentário nº 1: Insira um comentário de resposta à questão 2.1 */
    struct sockaddr_in address;
    /*********************************************
    **		Comentário nº1-resposta		**
    ** 	A estrutura do sockaddr_in serve para	**
    ** guardar os endereços de IP entre outras 	**
    ** informações necessárias para o computador**
    ** comunicar com o outro.			**
    *********************************************/

    /* Comentário nº 2: Insira um Comentário de resposta à questão 2.2 */
    /*********************************************
    **		Resposta à questão 2.2		**
    **	A função socket irá retornar uma um 	**
    ** "descritor" para identificar o socket se	**
    ** der erro a função irá retornar -1.	**
    *********************************************/
      
    // Nota: usar opões: AF_INET e SOCK_STREAM,
    
    DSCR=socket(AF_INET,SOCK_STREAM,0);
    
    if (DSCR==-1)
        perror("Socket");
    
    /* Comentário nº 3: Insira um comentário de resposta à questão 4 */
    /*********************************************
    **		Comentário nº3-resposta		**
    ** 	A primeira linha é para identificar a	**
    ** familia a que a estrutura irá utilizar	**
    ** para comunicar com o outro programa, já	**
    ** a segunda é para defenir o IP a que irá	**
    ** se conectar, mas aqui neste código esta-	**
    ** mos a dizer à estrutura que será qualquer**
    ** máquina					**
    *********************************************/
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(7000);
    
    //bind socket resposta à pergunta 2.4
    if(bind(DSCR, (struct sockaddr *) &address, sizeof (address))== -1)
    {
    	printf("ERROR a fazer bind!\n");
    	close(DSCR);
    	return 1;
    }


    if(listen(DSCR, 1) == -1)
    {
    	printf("ERROR a fazer listen!\n");
    	close(DSCR);
    	return 1;
    }

    //len = sizeof(struct sockaddr_in);
    
    new_DSR=accept(DSCR,NULL, NULL);
    /* Resposta à questão 2.5 */  

    if (new_DSR<0)
       perror("Accept");
    mensagem[0]='b';
    write(new_DSR,mensagem,TAM);
    
    new_DSR2=accept(DSCR,NULL, NULL);
    
    if (new_DSR<0)
       perror("Accept2");
    mensagem[0]='a';
    write(new_DSR2,mensagem,TAM);

    /* Comentário nº 4: Insira um comentário de resposta à questão 2.7 */
    /*********************************************
    **		Comentárioº4 - resposta		**
    **	Para receber alguma mensagem podemos	**
    ** utilizar várias funções, como o sscanf, 	**
    ** recv, entre outras, aqui utilizei o recv	**
    ** porque achei mais apropriado.		**
    *********************************************/
    /* Resposta à questão 2.6 */  
    
    recv(new_DSR, mensagem, TAM, 0);
    write(new_DSR2,mensagem,TAM);

    recv(new_DSR2, mensagem, TAM, 0);
    write(new_DSR,mensagem,TAM);
    
    recv(new_DSR, mensagem, TAM, 0);
    write(new_DSR2,mensagem,TAM);

    recv(new_DSR2, mensagem, TAM, 0);
    write(new_DSR,mensagem,TAM);
    
    
    
    /* Resposta à questão 2.8 */  
    
    close(DSCR);
    close(new_DSR);
     close(new_DSR2);

    return 0;
}

PS: e' preciso executar 2 clientes

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

isto e' para linux, para windows basta usar o winsock2.h.

podes sempre procurar por uma biblioteca de sockets em C++, e fica muito mais facil, eu como gosto de nao utilizar bibliotecas que eu nao saiba implementar manualmente.

encontrei esta class aqui http://www.adp-gmbh.ch/win/misc/sockets.html

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

podes-me ajudar a perceber melhor isto?

para começar que meto no meu programa para que ele abra a porta ou algo assim?

#include<winsock2.h>
\\...

estou um bocado baralhado 😉

  • 2 months later...
Posted (edited)

meu 1º objetivo em redes vai ser em criar um chat!

tenho que mandar informações de um computador para o outro e, para isso preciso de saber os ips de cada computador.

eu já estudei melhor um site e já sei algumas funções mesmo assim continuo a não perceber

lá muito :/

server:

#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
char buffer[1];
WSADATA WsaDat;

SOCKET s;
s=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr;

addr.sin_family=AF_INET;
addr.sin_port=htons(5001);
addr.sin_addr.s_addr=inet_addr("52.123.72.251");

while(system("pause")!=0){recv(s,buffer,sizeof(buffer),0);printf("%c",buffer[0]);}
}

client:

#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char buffer[1]={1};
WSADATA WsaDat;

SOCKET s;
s=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr;

addr.sin_family=AF_INET;
addr.sin_port=htons(5001);
addr.sin_addr.s_addr=inet_addr("52.123.72.251");

system("pause");
if((connect(s,(sockaddr*)&addr,sizeof(addr)))==SOCKET_ERROR){WSACleanup();printf("conexao falhou!!!");}
else send(s,buffer,sizeof(buffer),0);
system("pause");
}

não se riam o.O

Ajudam-me, diagam-me o que está mal e o que eu tenho que fazer para que o server leia o digito 1

Edited by seuqram
Posted

nao viste o meu post que tem um server e client??

So' percisas de substituir maior parte das bibliotecas de linux, pela a winsocks2 e iniciar o WSDATA e o programa roda em Windows

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

<.<

eu não quero sites em inglês, nem programas linux nem copiar os códigos fontes!!!

quero que me digam o que está mal no meu server/client e o que posso fazer para digitar 1!!!

server

#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
   char buffer[2];
   WSADATA WsaDat; 

   SOCKET s[3]; 
   s[0]=socket(AF_INET,SOCK_STREAM,0);
   sockaddr_in me;
   sockaddr you[2];

   me.sin_family=AF_INET;
   me.sin_port=htons(5555);
   me.sin_addr.s_addr=htonl(20.63.36.11);

   system("pause");
   recv(s[0],buffer,2,0);
   printf("%c\n",buffer[0]);
   system("pause");
}

cliente

#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
   char buffer[1]={'h'};
   char a[15];
   WSADATA WsaDat; 

   SOCKET s; 
   s=socket(AF_INET,SOCK_STREAM,0); 
   sockaddr_in you;

   sprintf(a,"20.63.36.11");

   you.sin_family=AF_INET;
   you.sin_port=htons(5555);
   you.sin_addr.s_addr=inet_addr(a);

   system("pause");
   if(connect(s,(LPSOCKADDR)&you,sizeof(you))==SOCKET_ERROR)
   {
      WSACleanup();
      printf("conexao falhou!!!");
   }
   send(s,buffer,sizeof(buffer),0);
   system("pause");
}
Posted

<.<

eu não quero sites em inglês, nem programas linux nem copiar os códigos fontes!!!

quero que me digam o que está mal no meu server/client e o que posso fazer para digitar 1!!!

Eu sinceramente nao gosto da tua atitude, nao queres em ingles, google e' teu amigo.... nao e' copiar, e' ver o que eu fiz e ves logo qual e' a chamada que te falta!!! Nao queres programas em linux, azar o teu...

Devido 'a tua atitude eu nao te ajudo, espero que outra pessoa te ajude....

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

Eu sinceramente nao gosto da tua atitude, nao queres em ingles, google e' teu amigo.... nao e' copiar, e' ver o que eu fiz e ves logo qual e' a chamada que te falta!!! Nao queres programas em linux, azar o teu...

Devido 'a tua atitude eu nao te ajudo, espero que outra pessoa te ajude....

já pesquisei no google todo

eu ja vi uns 100 exemplos

por isso n quero mais sites nem mais exemplos, quero ajuda vossa!

qual a atitude?

assim mais vale n dizer nada e não aprender nada...

eu sou novo por isso nao sei bem ingles em texto e o tradutor traduz muito mal.

espras que outra pessoa me ajude? se não forem voces nunca vou aprender

Posted

Nem vale a pena comentar...

Queres em portugues tens na wiki https://wiki.portugal-a-programar.pt/dev_geral/c/sockets_de_berkeley/

Ja' agora, usa a pesquisa do forum, esta' um tutorial de um user

https://www.portugal-a-programar.pt/topic/30524-winsockets-em-c/page__hl__sockets

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

1-o ip e o port do server meto um ao calhas?

2-qual acham melhor? TCP ou UDP

3-como saibo o ip do client?

4-quando o server ou o client envia a menssagem ao client ou server, teem de estar a ouvir logo que estão a enviar(ao mesmo tempo?)

teem alguma contra mim?

Posted

A porta a partir da 10000 acho que estas 'a vontade para escolher 'a sorte, tens que ver se a porta nao esta' ocupada por outro programa, o IP tens que meter o IP do servidor.

Para ti e' o TCP, UDP e' mais complexo e da' muito mais trabalho para a informacao chegar direita.

Tens que pegar no addr e converter para o IP.

Um fica a ouvir e outro a enviar, ate' podes estar a ouvir e enviar ao mesmo tempo.

Nao contra ti, mas contra algumas atitudes que tomas aqui, como por exemplo ate' parece que somos obrigados a te ajudar...

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.