Ir para conteúdo
Fórum Script Brasil
  • 0

Conexão De Multiplos Clientes Em Um único Servidor


Lucas Phillip

Pergunta

Aew... eu estou fazendo um servidor que aceite multiplas conexoes... ai eu dei uma procurada e cheguei a esse código pra aceita as conexoes:

Private Sub WskSvr_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
   iUsers = iUsers + 1
   Load Winsock(iUsers)
   Winsock(iUsers).LocalPort = iPorta
   Winsock(iUsers).Accept requestID
End If
e pra enviar as msgs ficou:
For u = 1 To iUsers
        If Winsock(u).State = 7 Then
            Winsock(u).SendData STR
        End If
    Next u

e funciono perfeitamente :D

só tem 1 problema então, depois que eu fiquei reparando no codigo... meu servidor vai fica online o tempo todo... então a quantidade de conexoes vai só aumentando... ai vai chegar uma hora que o for vai ficar tipo "for u = 1 to 1243512341234" e o servidor vai começar a ficar lento :(...

alguém tem alguma solução pra esse meu problema?

vlw :D

Link para o comentário
Compartilhar em outros sites

19 respostass a esta questão

Posts Recomendados

  • 0

Quando um cliente desconectar você vai ter o respectivo índice do Winsock livre, portanto poderá aproveitá-lo para outro usuário que for se conectar (e não precisará criar um novo para ele). Desta maneira você vai poder "economizar" na quantidade de conexões.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

hmm... então eu vou ter que criar uma função pra procurar o indice do winsock livre mais "proximo" e mandar usuario utilizar esse indice?

seria algo assim?

Exatamente. No caso, acho que você pode fazer isso olhando a propriedade State de cada um dos winsocks. Quando ela tiver o valor sckClosed é porque a conexão está fechada (seria bom também olhar outras possibilidades, como sckError ou sckBadState, por exemplo, para quando teve algum erro na conexão). Se houver algum livre, você vai utilizar o índice dele ao invés de incrementar iUsers e carregar um novo socket.

Sacou? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

tive mais problema :P lol...

eu acho que não to sabendo fechar a conexão direito... porque quando fecha o chat, da "winsock.close".. só que quando vou conectar denovo, fala que a conexão já está sendo usada :(

é assim mesmo que eu fecho uma conexao? ou tem que fechar no servidor de algum jeito também? vlw :D

Link para o comentário
Compartilhar em outros sites

  • 0

tive mais problema :P lol...

eu acho que não to sabendo fechar a conexão direito... porque quando fecha o chat, da "winsock.close".. só que quando vou conectar denovo, fala que a conexão já está sendo usada :(

é assim mesmo que eu fecho uma conexao? ou tem que fechar no servidor de algum jeito também? vlw :D

É o método Close mesmo. Como você está fazendo na hora de reaproveitar o socket?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

bom... pra fazer um teste, eu coloquei "load winsock(1)" sempre, pra ver se quando o usuario desconectasse e reconectasse aproveitava... mas fala que já foi carregada...

na verdade, eu não sei mexe muito com winsock não... tem algum tutorial completo que eu possa aprender melhor também?

vlw :D

Link para o comentário
Compartilhar em outros sites

  • 0

bom... pra fazer um teste, eu coloquei "load winsock(1)" sempre, pra ver se quando o usuario desconectasse e reconectasse aproveitava... mas fala que já foi carregada...

Você *não* vai fazer o Load novamente, porque o controle já existe. Você só faz o Load para criá-lo. Uma vez que ele já está criado, você vai apenas utilizá-lo.

na verdade, eu não sei mexe muito com winsock não... tem algum tutorial completo que eu possa aprender melhor também?

Se você diz um tutorial em relação a essa dúvida específica, dificilmente você vai encontrar, porque é mais um questão de entender como objetos são criados e utilizados em VB do que propriamente uma dúvida de winsock.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Você *não* vai fazer o Load novamente, porque o controle já existe. Você só faz o Load para criá-lo. Uma vez que ele já está criado, você vai apenas utilizá-lo.

beleza... então como eu faço para utilizar o controle que já existe? :(

Se refira a ele normalmente:

Winsock(x).LocalPort = iPorta
Winsock(x).Accept requestID

Onde "x" é o índice do winsock livre (que não está conectado). Por isso que eu te perguntei como você está fazendo para reaproveitar (ou achar o índice livre) o winsock. A idéia é: procurar um índice de um winsock desconectado; se achou, utilize o winsock deste índice; se não, incremente iUsers, crie um novo socket e utilize-o.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

bom, eu fiz assim, mas não deu:

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim Z As Integer
    Dim AchouLivre As Boolean
    Dim SCKLIVRE As Integer
    If Index = 0 Then
        For Z = 1 To (iUsers +1)
            If (Winsock(Z).State = sckClosed) Then
                AchouLivre = True
                SCKLIVRE = Z
            Else
                AchouLivre = False
            End If
        Next
        If (AchouLivre = False) Then
            iUsers = iUsers + 1
            Load Winsock(iUsers)
            Winsock(iUsers).LocalPort = iPorta
            Winsock(iUsers).Accept requestID
        Else
            Winsock(SCKLIVRE).LocalPort = iPorta
            Winsock(SCKLIVRE).Accept requetID
        End If
    End If
End Sub

quando tenta conectar, volta o erro "Control array element '1' doesnt exist" nessa linha: "If (Winsock(iUsers).State = sckClosed) Then" ...

como verifico então se o socket está livre ou não? :blink:

vlw :D

Link para o comentário
Compartilhar em outros sites

  • 0

bom, eu fiz assim, mas não deu:

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim Z As Integer
    Dim AchouLivre As Boolean
    Dim SCKLIVRE As Integer
    If Index = 0 Then
        For Z = 1 To (iUsers +1)
            If (Winsock(Z).State = sckClosed) Then
                AchouLivre = True
                SCKLIVRE = Z
            Else
                AchouLivre = False
            End If
        Next
        If (AchouLivre = False) Then
            iUsers = iUsers + 1
            Load Winsock(iUsers)
            Winsock(iUsers).LocalPort = iPorta
            Winsock(iUsers).Accept requestID
        Else
            Winsock(SCKLIVRE).LocalPort = iPorta
            Winsock(SCKLIVRE).Accept requetID
        End If
    End If
End Sub

quando tenta conectar, volta o erro "Control array element '1' doesnt exist" nessa linha: "If (Winsock(iUsers).State = sckClosed) Then" ...

como verifico então se o socket está livre ou não? :blink:

A linha que você cita não está no código. O que tem lá é "If (Winsock(Z).State = sckClosed) Then" e não "If (Winsock(iUsers).State = sckClosed) Then". E, iUsers começa de qual valor? Porque se ele começa de 1 e você está fazendo o incremento antes, o 1 é pulado e você só vai ter sockets a partir do 2. No caso, ele deveria começar de 0 ou o incremento ser depois do objeto ser criado.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

A linha que você cita não está no código. O que tem lá é "If (Winsock(Z).State = sckClosed) Then" e não "If (Winsock(iUsers).State = sckClosed) Then". E, iUsers começa de qual valor? Porque se ele começa de 1 e você está fazendo o incremento antes, o 1 é pulado e você só vai ter sockets a partir do 2. No caso, ele deveria começar de 0 ou o incremento ser depois do objeto ser criado.

Abraços,

Graymalkin

foi mal... a linha que eu uso e que dava erro é "If (Winsock(Z).State = sckClosed)" pra conferir conexão por conexao com o "for"... a outra la foi erro na hora de pedi ajuda mesmo :D

bom, você tava certo.. tava dando erro porque o iusers começava do 0, e não do 1... então eu substitui o "for Z = 1 to (iusers +1)" por "for Z = 0 to iusers " e o erro parou de dar... só que também não está achando nenhuma conexao livre... está sempre criando uma nova :(

olha o codigo ai como ficou:

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim Z As Integer
    Dim AchouLivre As Boolean
    Dim SCKLIVRE As Integer
    If Index = 0 Then
        For Z = 0 To iUsers
            If (Winsock(Z).State = sckClosed) Then
                MsgBox "oi"
                AchouLivre = True
                SCKLIVRE = Z
                Exit For
            End If
        Next
        If (AchouLivre = False) Then
            iUsers = iUsers + 1
            Load Winsock(iUsers)
            Winsock(iUsers).LocalPort = iPorta
            Winsock(iUsers).Accept requestID
        Else
            Winsock(SCKLIVRE).LocalPort = iPorta
            Winsock(SCKLIVRE).Accept requetID
        End If
    End If
    Label2.Caption = "Sockets Utilizados: " & iUsers
End Sub

eu coloquei aquele msgbox ali pra ver mais facil se tava achando um socket livre ou não...

e agora? :blink:

Link para o comentário
Compartilhar em outros sites

  • 0

*edit* foi mal.. postei 2 vezes seguida :P, então le o outro post antes deste

novidades :D

eu dei um msgbox winsock(iusers).state pra ver como tavam ficando as conexões... ai voltava sempre "8" pros sockets que deveriam estar "livres"...

ai eu pensei.. vo coloca "If (Winsock(Z).State = sckClosed) Or (Winsock(Z).State = sckClosing) Then" pra verifica se está livre... e funciono... :D só que ainda está com um outro problema...

na hora que vai carrega o socket que está livre com:

Winsock(SCKLIVRE).LocalPort = iPorta
            Winsock(SCKLIVRE).Accept requetID

da esse erro: "Invalid operation at the current state"... ou seja, se o socket não está fechado e esta "fechando" não é assim que vou re-utilizar ele...

ai se não é assim como é? ou eu volto na minha duvida mais cedo... sera que eu não to fechando o socket direito? porque eu coloquei winsock.close no programa do usuario...

Link para o comentário
Compartilhar em outros sites

  • 0

aí... foi mal postar 3 vezes seguidas... mas é que por algum motivo, eu consigo resolver melhor as coisas depois que posto a duvida no forum :P

bom, de qualquer forma, eu consegui fazer funcionar o codigo... eu só coloquei um winsock.close pra arruma o problema.... bom ai está o script final pra quem quiser :D

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim Z As Integer
    Dim AchouLivre As Boolean
    Dim SCKLIVRE As Integer
    If Index = 0 Then
        For Z = 0 To iUsers
            If (Winsock(Z).State = sckClosed) Or (Winsock(Z).State = sckClosing) Then
                On Error Resume Next
                Winsock(Z).Close
                AchouLivre = True
                SCKLIVRE = Z
                Exit For
            End If
        Next
        If (AchouLivre = False) Then
            iUsers = iUsers + 1
            Load Winsock(iUsers)
            Winsock(iUsers).LocalPort = iPorta
            Winsock(iUsers).Accept requestID
        Else
            Winsock(SCKLIVRE).LocalPort = iPorta
            Winsock(SCKLIVRE).Accept requestID
        End If
    End If
    Label2.Caption = "Sockets Abertos: " & iUsers
End Sub

vlw Graymalking.... você ajudo D++!! :D

Link para o comentário
Compartilhar em outros sites

  • 0

Ola pessoal....

sou novo aqui no forum e estou tentando fazer um chat pra mim... igual o que vocês montaram

pesquisei na net e achei esse tutorial http://www.macoratti.net/winsok_2.htm mas ele só ensina a fazer um chat ponto a ponto.

não estou conseguindo fazer o que vocês fizeram ai nos outros topicos...

estou tendo uma certa dificuldade .. em entender como se faz .. para conectar varios cliente no servidor....

se não fosse pedir muito....

vocês não teriam algum exemplo pra me mandar fazendo favor......

só pra mim... ver como que foi feito...e tentar entender o codigo...

se alguém puder postar alguma coisa que me ajude .....

obrigado...

fico no aguardo......

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...