Duvidas - Sockets

1. Duvidas - Sockets

guilherme
gcrfc

(usa Ubuntu)

Enviado em 20/11/2011 - 23:56h

Ola pessoal, sou novo por aqui e venho pedir ajuda aos q tem experiencia com programação de sockets!

bom existe um jogo chamado WYD, e eu iniciei a programação de um emulador para ele, pois temos o server original porem o jogo esta na verção 7.58 e o emulador é ainda da 6.13.

neste espaço entre as verções muita coisa mudou, e atualizar ele por meio de uma dll fica muito desvantajoso.

o emulador original deste mmo, possui uma DataBase Server, a qual o GameServer se conecta, e os Clientes se conectam ao GameServer!

tem varios projetos de emuladores para esse jogo na net, porem todos utilizam o mysql como DB. Eu gostaria de seguir a linha do emulador original, tendo uma DataBase Server, onde esta aceitara a conexão de até 5 GameServers, e estes por sua vez aceitaram até 750 Clientes!

o original funciona mais ou menos assim!

o cliente envia a solicitação de login ao GS, este por sua vez interpreta o packet recebido, e reenvia para a database, onde ela verifica se a conta existe, se esta logada, etc. E envia a resposta ao GS q por sua vez envia ao Cliente!

O que eu gostaria de saber, é como eu poderia proceder com a programação dos sockets pro gameserver, ja q ele tem q ser cliente da DB e Servidor dos Clientes!!

se alguem puder me da um exemplo de como fazer isso seria de grandee ajuda!

Grato e até^^


  


2. Re: Duvidas - Sockets

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 22/11/2011 - 10:55h

Você tá querendo fazer o banco de dados do programa na unha?

A linguagem C no linux já tem biblioteca incluída para acesso/manipulação de MySQL. Acho que seria mais fácil. Aqui no VOL mesmo tem alguns artigos sobre isso.

Mas, se quiser fazer na mão, vai ter que fazer um servidor de banco de dados e com abertura de sockets. Para isso, monte uma lista encadeada ou árvore binária. As listas duplamente encadeadas são MUITO mais fáceis de implementar que as árvores AVL, e acho que é a opção sensata para seu problema, já que você planeja ter até 1000 cadastros (players). Eu mesmo tenho um artigo aqui no VOL sobre Listas Encadeadas.

Sockets:
~~~~~~~~
http://www.linuxhowtos.org/C_C++/socket.htm
http://cs.baylor.edu/~donahoo/practical/CSockets/textcode.html
http://gnosis.cx/publish/programming/sockets.html

Bom, como você pode ver, um exemplo de um programa desse seria bem grande, e acredito que apenas as referencias e guias aqui expostos devam ajudar. Qualquer dúvida específica, é só perguntar.

Programa 1 - Banco de Dados + Função Servidor
Lista duplamente encadeada com algum algoritmo de criptografia.(MD5 é bem legal pra guardar senhas ;)
Abertura de porta TCP/IP para servidor. (ex: 1234)
Funções de autenticação de usuário.


Programa 2 - GameServer - Programa cliente/servidor condicional.
QUANDO um cliente se conectar a ele com um login e senha, este GS vai se conectar ao servidor e pedir autenticação.
Para a função de servidor DO GAMESERVER, use uma porta diferente da usada pelo servidor DO BANCO DE DADOS.

Ou seja, ela trabalha APENAS como servidor enquanto não houver ninguém conectado a ele, depois ele VIRA CLIENTE DO BANCO DE DADOS e continua sendo servidor de clientes.

Programa 3 - Cliente ;)


GameServer.C - Pseudo-code
~~~~~~~~~~~~

server(){
socket();
bind();
listen();// aqui você fala quantos podem se conectar simultaneamente

if( accept()... ){

conexão_bd = connect(); // aqui você conecta no banco de dados

// aqui você envia os dados etc

}
}


Se quiser realmente dar um passo além e sofisticar a coisa toda, pode pesquisar sobre POSIX threads... Ai a coisa fica bem legal... mais bem mais complicada... ;)


Espero ter ajudado,
Qualquer coisa posta denovo,
Enzo Ferber
[]'s



3. Re: Duvidas - Sockets

guilherme
gcrfc

(usa Ubuntu)

Enviado em 23/11/2011 - 00:12h

EnzoFerber escreveu:

Você tá querendo fazer o banco de dados do programa na unha?

A linguagem C no linux já tem biblioteca incluída para acesso/manipulação de MySQL. Acho que seria mais fácil. Aqui no VOL mesmo tem alguns artigos sobre isso.

Mas, se quiser fazer na mão, vai ter que fazer um servidor de banco de dados e com abertura de sockets. Para isso, monte uma lista encadeada ou árvore binária. As listas duplamente encadeadas são MUITO mais fáceis de implementar que as árvores AVL, e acho que é a opção sensata para seu problema, já que você planeja ter até 1000 cadastros (players). Eu mesmo tenho um artigo aqui no VOL sobre Listas Encadeadas.

Sockets:
~~~~~~~~
http://www.linuxhowtos.org/C_C++/socket.htm
http://cs.baylor.edu/~donahoo/practical/CSockets/textcode.html
http://gnosis.cx/publish/programming/sockets.html

Bom, como você pode ver, um exemplo de um programa desse seria bem grande, e acredito que apenas as referencias e guias aqui expostos devam ajudar. Qualquer dúvida específica, é só perguntar.

Programa 1 - Banco de Dados + Função Servidor
Lista duplamente encadeada com algum algoritmo de criptografia.(MD5 é bem legal pra guardar senhas ;)
Abertura de porta TCP/IP para servidor. (ex: 1234)
Funções de autenticação de usuário.


Programa 2 - GameServer - Programa cliente/servidor condicional.
QUANDO um cliente se conectar a ele com um login e senha, este GS vai se conectar ao servidor e pedir autenticação.
Para a função de servidor DO GAMESERVER, use uma porta diferente da usada pelo servidor DO BANCO DE DADOS.

Ou seja, ela trabalha APENAS como servidor enquanto não houver ninguém conectado a ele, depois ele VIRA CLIENTE DO BANCO DE DADOS e continua sendo servidor de clientes.

Programa 3 - Cliente ;)


GameServer.C - Pseudo-code
~~~~~~~~~~~~

server(){
socket();
bind();
listen();// aqui você fala quantos podem se conectar simultaneamente

if( accept()... ){

conexão_bd = connect(); // aqui você conecta no banco de dados

// aqui você envia os dados etc

}
}


Se quiser realmente dar um passo além e sofisticar a coisa toda, pode pesquisar sobre POSIX threads... Ai a coisa fica bem legal... mais bem mais complicada... ;)


Espero ter ajudado,
Qualquer coisa posta denovo,
Enzo Ferber
[]'s


puts kra vlw pela sua atenção, pois é eu gostaria de fazer a db na marra ^^, pois usando mysql ja existe, infelizmente nem um terminado, mas existe toda a base pronta!

vou deixar aki umas SSs da DB com o GS apenas e uma com a DB o GS e 1 Cliente

http://imageshack.us/photo/my-images/404/dbtm.jpg/

http://imageshack.us/photo/my-images/560/dbtmclconnected.jpg/

como vc pode ver, as telas do cmd, para a DB e para o GS, são partes do Patch q foi feito no emulador original, para este aceitar conexoes dos clientes mais atuais!

e a cmd do cliente, é um packet tracer q foi feito para snifarmos os packets q o cliente envia para podermos corrigir as diferenças!

porem tem muito packets do cliente atual q almentaram em relação ao emulador q temos 6.13, e atualizar todos o emulador pormeio a dll fica meio q inviavel, por isso decidimos fazer o emulador!

nessas SSs, o char ainda nao esta no WORLD do jogo, quando ele entra no WORLD, o GS, fik pingando tando no cliente quanto na DB, de tantos em tantos segundos, e o q eu gostaria é um sistema parecido com esse!

vou estudar os links q vc me indicou.

vlw ae pela ajuda ^^


4. Re: Duvidas - Sockets

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 23/11/2011 - 01:23h

vc mesmo já respondeu a sua pergunta.
Vc vai ter um deamon que é servidor e cliente de uma outra aplicação ao mesmo tempo.
O restante é programação C.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts