• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

softklin

[VB6] Winsock: Erro ao "escutar" ligações...

12 mensagens neste tópico

Olá pessoal.

De continuação com o meu projecto de falar numa rede, gostava que me esclarececem acerca de um erro que surge.

Quando defino o programa (supondo que agora nesta versão experimental apenas um computador envia mensagens - cliente - e o outro recebe - servidor) para "escutar" (listen) mensagens (no lado servidor), este dá um erro de "incorrect state", ou seja, aparentemente o estado para escutar está incorrecto.

Não me consigo explicar melhor... :-[ Vejam o código sff

----- Código que corre no lado cliente (envia msgs) ---------

Private Sub Form_Load()
winsock1.remotehost = "xxx.xxx.xxx.xxx" 'IP de ligacao
winsock1.remoteport = xxxx 'Porta
winsock1.connect
end sub

Private Sub cmdEnviaMsg()
winsock1.sendData txtMensagem
end sub

----- Código que corre no lado servidor (recebe msgs) ---------

Private Sub Form_Load()
winsock1.localport = xxxx
winsock1.listen 'Pa ficar a "ouvir" mensagens
end sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
winsock1.accept requestID  'Faz auto accept e e aqui que da bug
end sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
dim sMsg as string
winsock1.getData sMsg
lstMensagens.AddItem sMsg
end sub

Bom, eu penso que o problema está mesmo na Connection Request! Quando chega a este passo, dá o erro de que o estado não é válido (winsock1.state = 6 quando deveria ser winsock1.state=2)...

Já agora, não tenho o programa escrito ainda, porque isto é código ainda para ser revisto, consoante a resolução.

Espero ter explicado bem...  :thumbsup: Desde já obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

winsock1.accept requestID  'Faz auto accept e e aqui que da bug

end sub

Faltate ai uma linha. Tens de meter esta linha antes dessa(winsock1.accept requestID)

Winsock1.Close

Para não aceitar mais conecções nenhumas  :thumbsup:

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tentei fazer isso e dá-me sempre erro: "Run-time error '10022': socket not bound or listen is not invoked prior to accept".

Este erro dá tanto no Servidor como no Cliente  :dontgetit:

O Debug aponta para o winsock1.connect.

Alguém sabe o porquê e como o resolver?

Obrigado ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas... Para te dar esse erro tanto no cliente como no servidor... Que portas estas a utilizar, e no servidor que IP estas a colocar? Podes aqui colocar o código tal e qual o tens?

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom agora já consegui por o servidor (adicionei antes de por o ip \\) mas o cliente esta com o mesmo problema :S

Como pedido aqui fica o código do servidor:

Private Sub Form_Load()
Winsock1.remotehost = "\\192.168.2.2" 
Winsock1.remoteport = 123 
Winsock1.Connect
End Sub

Private Sub cmdEnviaMsg()
Winsock1.sendData txtMensagem
End Sub

E do local:

Private Sub Form_Load()
Winsock1.localport = 123 
Winsock1.listen
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close 
Winsock1.accept requestID  
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sMsg As String 
Winsock1.GetData sMsg
lstMensagens.AddItem sMsg
End Sub

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

as duas barras usa-se normalmente quando é para aceder por rede local, nao é? tipo para aceder aos ficheiros partilhados \\IP ou \\hostname...

tu nao precisas das duas barras(\\) porque o winsock vai correr sobre 1 protocolo que tu expecificas, http, ftp, etc...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já resolvi o problema, por mais estúpido que pareça bastou compilar o programa, executar o exe e já não dava erro  ;)

Alguém tem dicas de como fazer um chat para vários utilizadores? É que sockets ainda não sei muito manobrar e pelo que percebi o socket só pode receber uma informação certo?

Não seria possível algo:

Servidor:

winsock1.sendData texto_nick
winsock1.sendData texto_texto

Cliente:

Dim texto_texto, texto_nick As String
winsock1.GetData texto_nick
winsock1.getdata texto_texto

?? ?? ??

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para isso, tens de criar um controll array para o socket. E depois ires criando novos sockets em run-time.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fica em anexo um código com o que eu estava a dizer. Tem apenas o essencial, depois podes adicionar ou alterar o que queres. Podes ver também um exemplo um pouco mais elaborado aqui.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora