none
有關socket瞬間大量要求連線的問題 RRS feed

  • 問題

  • 想請教各位高手
    就是小弟最近當公司用VB.net做一個socket的後台
    之前經過大大們的幫忙~~已經寫出個堪用品
    因為只不太到有關非同步的範例~MSDN講的也一直看不懂
    所以小弟還是用同步方式每一個用戶加開一個執行緒
    不過剛做壓力測試~~瞬間100個用戶連線
    小弟是用Accept後新建的socket的port來當他們的連線ID
    理論上一個用戶對應一個port~~這樣想應該是沒錯吧
    但是我用Collection來裝socket ob跟port號當key
    發現竟然會有部分用戶的port重複~~?!
    導致Collection發生錯誤(key重複)
    反覆測試後發現就算是瞬間5個用戶連線也會這樣~~
    後來我在主要的Thread(Accept專用)建立新用戶的Thread後
    用Thread.Sleep(200)可以解決這個問題~再設小一點偶而又會有用戶的port重複
    不過100個用戶連線加起來就要等20秒了~~
    請教各位經驗老到的高手們~~可否指點小弟一條明路呢~~
    也請大大們幫我看看這樣的結構有沒有問題(一定有)
    這個案子拖太久了~對主管很不好意思阿~~~


    Code Snippet

    Public Class TcpSock

    Public Sub New( port ,  count )
            listenMax = count
            Dim ipPort As New IPEndPoint(IPAddress.Any, port)
            socket.Bind(ipPort)
            socket.Listen(listenMax)
            serThread = New Thread(New ThreadStart(AddressOf clientAccept))
            serThread.Start()
    End Sub

    Private Function clientAccept()
            While True
                If clientList.Count < listenMax Then
                    acceptClient = socket.Accept()
                    cliThread = New Thread(New ThreadStart(AddressOf clientService))
                    cliThread.Start()
                    Thread.Sleep(200)
                Else
                    acceptClient = socket.Accept()
                    acceptClient.Close()
                End If
            End While
            Return ""
    End Function

    Private Function clientService()
            Dim clientSock As Socket = acceptClient
            Dim cEP As IPEndPoint = clientSock.RemoteEndPoint
            RaiseEvent ConnectionRequest(CStr(cEP.Port()))
            clientList.Add(clientSock, cEP.Port().ToString())
            ...


            Return ""
    End Function

    End Class

    2008年8月25日 下午 03:58

解答

  • 不要共用acceptClient 
    當成私有變數傳給
      clientService

    Dim acceptClient As Socket = socket.Accept()
    cliThread = New Thread(New ThreadStart(AddressOf clientService))
    cliThread.Start(
    acceptClient)

    2008年8月26日 上午 01:15

所有回覆

  • 不要共用acceptClient 
    當成私有變數傳給
      clientService

    Dim acceptClient As Socket = socket.Accept()
    cliThread = New Thread(New ThreadStart(AddressOf clientService))
    cliThread.Start(
    acceptClient)

    2008年8月26日 上午 01:15
  • 原來如此~~~
    原來可以這樣傳值過去阿~~~我還太菜啦
    多謝大大~~~
    2008年8月27日 上午 01:34