Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sipmann

[Resolvido] Problema com winsock, conexao!

Recommended Posts

bom... criei toda a conexao e tals... ele aceita! e tudo!! mas tipo.. se eu fexa a aplicação do cliente e a app do servidor fica rodando se eu abrir novamente o cliente quando eu vou manda o login e a senha ele da o erro

 

"Run-time error '40006'

Wrong protocol or connection state for the requested transaction or request

 

isso eu to vendo q eh toda vez q mandar algo com o SendData... pq isso ocorre!! pq tipo... quando da o erro ele sublinha o segundo SendData...

 

pq se eu clicar em entra asbre a tela login e posso loga q ele envia e recebe se deu certo!! mas se dai eu fexo o aviso q deu certo e clico no sair q dai ele iria enviar pro servidor uma mensagem informando que esta saindo.... ele da o erro... ou se eu usa qualquer SendData se n for a primeira vez ele da o erro! sem falar q se eu entra e dai sair ele n envia o texto!!

 

se alguem entendeu me explique!! vlwww

 

o código pra aceita a conexao do servidor e pra recebe os dados dai o enviar dos dados do cliente respectivamente

 

ACEITAR CONEXAO NO SERVIDOR

Private Sub Servidor_ConnectionRequest(ByVal requestID As Long)
	If Servidor.State <> sckClosed Then Servidor.Close
	Servidor.Accept requestID
	status.AddItem "SERVIDOR ::> " & Servidor.RemoteHostIP & " conectou-se"
End Sub

RECEBER DADOS E ENVIA-LOS - SERVIDOR

Private Sub Servidor_DataArrival(ByVal bytesTotal As Long)
	Dim dados As String
	Dim User As String
	Dim Senha As String
	
	Dim Sql As String
	
Servidor.GetData dados
Recebi() = Split(dados, "%")
Select Case Recebi(0)
	Case "LOGIN"
		User = Recebi(1)
		Senha = Recebi(2)
		Sql = "SELECT * FROM usuarios where usuario = '" & User & "' and senha = '" & Senha & "'"
		Conexao.Open "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=prop;USER=root;PASSWORD=123;OPTION=3;"
		Registros.Open Sql, Conexao
		If Registros.EOF Then
			Servidor.SendData "Login%Erro"
		Else
			Servidor.SendData "Login%sucesso%" & User & ""
			status.AddItem "CLIENTE ::> " & User & " conectou-se"
		End If
	Case "Chat"
	
			
End Select

End Sub

CONEXAO DO CLIENTE COM O SERVER

If Cliente.State = sckConnected Then Cliente.Close
	
		Cliente.RemoteHost = "127.0.0.1"
		Cliente.RemotePort = 222
		Cliente.Connect

ENVIO DO SEGUNDO SendData

 

Private Sub BtnSair_Click()
		
If Cliente.State = sckConnected Then
		Cliente.Close
		Cliente.SendData "Sair%Logout"
End If
End
End Sub

 

obrigado desde ja!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Private Sub BtnSair_Click()
		
If Cliente.State = sckConnected Then
		Cliente.Close
		Cliente.SendData "Sair%Logout"
End If
End
End Sub

Tenta inverter a linha Cliente.Close com a linha Cliente.SendData "Sair%Logout"

Ficando assim:

 

Private Sub BtnSair_Click()
		
If Cliente.State = sckConnected Then
		Cliente.SendData "Sair%Logout"
		Cliente.Close
End If
End
End Sub
Creio que seja isso, pois você fecha a conexão e depois tenta enviar a mensagem.

 

Flw, se continuar dando o erro grita que alguem responde ;D.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom... esse erro ali n da mais ateh pq o erro era esse mesmo n sei como tive a capacidade de faze isso ¬¬

mas bom continuando!

 

o servidor parece n receber o texto enviado! e tmb se eu fechar e abrir denovo deixando o server ligado... como eu falei antes!!

 

da o erro!

 

"Run-time error '40006'

Wrong protocol or connection state for the requested transaction or request

 

 

eh como se ainda tivesse conectado... n sei!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece, ja aconteceu coisa pior comigo :D

Esse erro ai aparece no cliente quando você tenta enviar alguma coisa ?

 

Olha esse trecho

Private Sub Servidor_ConnectionRequest(ByVal requestID As Long)
	If Servidor.State <> sckClosed Then Servidor.Close
	Servidor.Accept requestID
	status.AddItem "SERVIDOR ::> " & Servidor.RemoteHostIP & " conectou-se"
End Sub

Porque você fecha o servidor ?

 

flw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu procurei na net e ele diz q toda vez q quando se vai realizar uma nova conexão com o servidor você primeiro deve fechar axei em tudo q eh tuto da net!!

=]

 

e sim da quando vou tentar enviar algo pro server =[

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lendo no site da M$(http://support.microsoft.com/kb/183987) achei uma coisa.

 

Pelo poco que ingles que entendo, você tem que esperar o método connect se encerrar.

 

The code is trying to call the SendData method before the port has actually been connected. The Connect method in Visual Basic is asynchronous and is more like a request to connect to the Winsock port.

 

tenta colocar alguns

DoEvents
depois da linha da linha com o método Connect

Edit:

ou então faz um While

While(not(Cliente.State = sckConnected))
wend

Isso deve resolver

Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

ainda n tentei n to em casa quando volta eu testo... mas tipo... sera? pq o login q eh logo depois do connect funciona manda os dados e tals soh no segundo q n funciona!

 

bom mas vo tenta

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é seguinte, para você logar pela primeira vez, o servidor precisa estar "ouvindo" não precisa? Ou seja, ele tem que estar pronto para receber uma conexão para poder efetivá-la.

 

Quando você fecha o cliente, o servidor simplesmente fecha também, não ficando pronto para receber outra conexão, mas não se preocupe porque é a coisa mais fácil de resolver.

 

Basta no evento close do socket, você mandar ele ouvir novamente, assim:

 

CODE

Private Sub sckServidor_Close(index As Integer)

 

If sckServidor.State <> sckClosed Then sckServidor.Close

sckServidor.Bind 5000

sckServidor.Listen

 

End Sub

 

Beleza??

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

n funcionoooo =[

 

esse evento que você falo pra por (Claudio) eh no do servidor não é???

 

bom... de qualquer forma ele continua dando erro... o mesmo =[

 

ele conecta a primeira vez... faz o login... legal... fexo o programa cliente o server fica la sem eu mexe dai rodo otro clienet quando clico no entrar onde eh realizada a conexao n da nada... mas quando vai enviar... complica ... da o erro =[

 

vlwww

 

 

EDIT:::

Eu sinceramente desisto..... será q alguem podria me mandar o link para um programa usando esse recuros:?? mas com muiti-conexões!!! que é o q eu queria fazer mas n esta funcionando!!!!

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

n funcionoooo =[

 

esse evento que você falo pra por (Claudio) eh no do servidor não é???

 

bom... de qualquer forma ele continua dando erro... o mesmo =[

 

ele conecta a primeira vez... faz o login... legal... fexo o programa cliente o server fica la sem eu mexe dai rodo otro clienet quando clico no entrar onde eh realizada a conexao n da nada... mas quando vai enviar... complica ... da o erro =[

 

vlwww

 

 

EDIT:::

Eu sinceramente desisto..... será q alguem podria me mandar o link para um programa usando esse recuros:?? mas com muiti-conexões!!! que é o q eu queria fazer mas n esta funcionando!!!!

 

vlw

Cara, não faz muito sentido não não ter funcionado, pois é assim que utilizo e não me ocorre erro nenhum.

 

Agora quanto a sua outra necessidade, não sei se é possível, e bem provável não seja. Fui atrás disso em um monte de lugares e descobri que para que isso seja possível é necessário trabalhar com Threads, e pelo que achei na net, o Vb não trabalha com Threads, ou seja, não é possível fazer multiconexão com o vb.

 

Agora posta aqui para mim o código que você tentou fazer o que eu falei, deve ter algo errado, pois era para funcionar.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

malz pela demora!!!

bom... melhor q postas os códigos ta ai o prog

 

soh 14 k pq ateh agora soh tem login

 

http://rapidshare.de/files/38587683/struc-_mmorpg.rar.html

 

 

vlwwww mas se precisa do codigo mesmo assim pede... pq axei q assim ia simplifica!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

malz pela demora!!!

bom... melhor q postas os códigos ta ai o prog

 

soh 14 k pq ateh agora soh tem login

 

http://rapidshare.de/files/38587683/struc-_mmorpg.rar.html

 

 

vlwwww mas se precisa do codigo mesmo assim pede... pq axei q assim ia simplifica!!!

Pronto meu amigo, seu programa está resolvido. Me passe um e-mail seu que te envio de volto, não tenho acesso ao servidor que você colocou.

 

Se preocupe não que fica como cortesia da casa, huahuahuuha...

 

Depois se não entender alguma coisa que eu tenha feito me avise que explico direitinho.

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

vlwww sipmann@gmail.com

^^

 

e obrigado por arruma!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

vlw rodo sim!!! soh me diz o q tu mudo.. por acaso eu vi la um Servidor.bind 222 q eh a porta... mas pq isso ao invez de port ???

 

e q mais q tu mudo =] ???

 

vlwww!!!! Muito obrigado mesmo!

 

Edit:

 

alias.... para por exemplo eu vi no código que não ha (no cod do winsock) nenhuma função pra saber quantos estão on... tipo o numero total de usuarios online... ta beleza pra isso eh facil! mas o problema eh... como eu faria pra enviar uma mensagem para todos? ou ele envia mesmo assim... vai parece pregruiça mas eh q por um tempo n vo te acesso ao meu pc nem a nenhum q tenha vb instalado =S

 

saberia responder?

Compartilhar este post


Link para o post
Compartilhar em outros sites

vlw rodo sim!!! soh me diz o q tu mudo.. por acaso eu vi la um Servidor.bind 222 q eh a porta... mas pq isso ao invez de port ???

 

e q mais q tu mudo =] ???

 

vlwww!!!! Muito obrigado mesmo!

 

Edit:

 

alias.... para por exemplo eu vi no código que não ha (no cod do winsock) nenhuma função pra saber quantos estão on... tipo o numero total de usuarios online... ta beleza pra isso eh facil! mas o problema eh... como eu faria pra enviar uma mensagem para todos? ou ele envia mesmo assim... vai parece pregruiça mas eh q por um tempo n vo te acesso ao meu pc nem a nenhum q tenha vb instalado =S

 

saberia responder?

 

Na verdade da na mesma da forma que eu fiz e da forma que tava. O que eu mudei mesmo foi no cliente.

 

Primeiro lugar, o seu if estava errado, tava inverdido, a mensagem dizendo que não estava conectado estava aparecendo invertida, mas isso era de menos. Repare que coloquei um do events:do events:do events:do events

 

Coloquei isso porque o servidor estava conectando mas não mandava responde de conexão para o cliente a tempo. Então quando ia para seu if, o cliente ainda não tinha recebido a conexão. Isso resolveu.

 

Agora quanto as multiplas conexões, se for procurar, caso ache alguma coisa, por favor me avise.

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ta beleza!! vlw bvlw mesmo!!

 

e pode deixar q eu aviso... =]

 

e vlw por tudo mesmo!!

Abraços

 

Edit: outro problema =[

 

você ja viu o dataArrival do server nao eh? se nao... n faz mal olha ai

Case "LOGIN"

User = Recebi(1)

Senha = Recebi(2)

Sql = "SELECT * FROM usuarios where usuario = '" & User & "' and senha = '" & Senha & "'"

Registros.Open Sql, Conexao

If Registros.EOF Then

Servidor.SendData "Login%Erro"

Registros.Close

Else

Dim chars As String

Dim i As Integer

char_quant = Registros("num_char")

Registros.Close

If char_quant >= 1 Then

Sql = "SELECT * FROM `char` WHERE `usuario_dono` = '" & User & "'"

Registros.Open Sql, Conexao

i = 0

Do While Registros.EOF

If (chars <> "") Then

chars = "," & Registros("abla")

Else

chars = Registros("abla")

End If

 

i = i + 1

Loop

Else

chars = "Nenhum char"

End If

Servidor.SendData "Login%sucesso%" & User & "%" & chars

status.AddItem "SERVIDOR ::> " & User & " conectou-se com " & char_quant & " chars"

Registros.Close

End If

 

essa eh o case LOGIN como pode ver

ai tem um porem... como pode ver aqui perto do fim eu botei pra add na list do server quem conectou-se e agora eu botei o char_quant pra testa... ta esse eh par pega a quantia de char(personagens) q ele tem pra logar no server ta... ele retorna certo... mas agora quando eh pra pega o nome dos char e passa pra uma string soh (ali em negrito!) mas ai tem um porem os nomes dos char n aparecem... da em branco... sem nada nenhum user =[

 

sera q seria no Registros.Open Sql, Conexao.... dava pra me ajuda denovo =] eu fiz desse geito pq eu so novato em VB... e era assim q eu fazia em PHP!!!

bom desde ja obrigado!!! VLWWWWW

Compartilhar este post


Link para o post
Compartilhar em outros sites

Do While Registros.EOF
  If (chars <> "") Then
	chars = "," & Registros("abla")
  Else
	chars = Registros("abla")
  End If

  i = i + 1
Loop
Olha, esse pedaço ai tem um pequeno erro de lógica

 

Registros.EOF só vai ser verdadeiro quando o ponteiro da tabela chegar no fim da mesma, entao do jeito que ta ai ele nem entra no laço, Coloca um Not(Resgistros.EOF) no Do While que resolve.

 

Você também tem que colocar um

Registros.MoveNext 'dentro do loop
Se não ponteiro da tabela vai ficar parado no mesmo registro e seu programa vai parar por que nunca vai achar o fim da tabela.

 

 

 

 

Duvida: Essa SQL da certo?

Sql = "SELECT * FROM `char` WHERE `usuario_dono` = '" & User & "'"

 

 

Tentei fazer aqui (uma outra query com aspas no campo e tabela) e acusou que tava incompleta.

 

 

 

Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza jaja testo o q você me passou =]

 

bom mas estou com outro problema...

to lendo o mapa por um txt e jogando numa matriz bidimensional

até ai beleza... gravo certinho

 

massssss na hora de joga na picture box... tipo...

 

ai esta esta o prob ele da erro... eu to pegando de otras pictures no form futuramente vo troca... olha a parte de imprimi

 

Picture1.PaintPicture "imagem" & matriz(x, y).Picture, x * 32, y * 32

 

da esse erro ai 'invalid qualifier'... ai sublinha a matriz

 

ja tem a picture mas n sei o q seria este erro!

 

vlwwwwwwws denovo =]... devem ja ta de saco cheio... pq to enchendo esse forum de perguntas!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Picture1.PaintPicture "imagem" & matriz(x, y).Picture, x * 32, y * 32

o primeiro parametro tem que ser uma imagem.E ali você colocou uma string contatenando com o que tem na matriz.

 

Tente assim

Picture1.PaintPicture LoadPicture(App.Path  & "\images\image" & matriz(x, y) & ".JPG"), x * 32, y * 32

A função LoadPicture carrega uma imagem. (ó, o capitão óbivio esta sobrevoando a região :P)

 

Flw, se continuar dando erra ou precisar de mais alguma coisa é só gritar :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.