none
前後端連線問題~ Winsock RRS feed

  • 問題

  • 想請教各位大大:

    目前我使用Winsock做前後端連線 , 目前狀況是只能一台client連線

    應該是把聆聽port拿來接受用, 變成其他client無法連進來

    請問Winsock有辦法多機連線嗎 又該從何下手?

    WskServer.LocalPort = 5555 , 好像只有這裡可以設定port

    因為 我是專題在用 之前璉大有建議我使用Socket而不要用Winsock

    但因為是沿用之前學長姐的程式 如果要改 必須改很多地方

    所以 想請問各位大大 是否只有使用socket才能修正我目前的問題?

    另外 我也遇到了一個很奇怪的問題 ,(前後端都是Windows XP)

    就是 我前後端連線用winsock透過校園無線網路連接到server端可正常連線 , 而用3G撥號連線卻無法正常連到server端

    老師 跟我說 應該程式有錯 導致3G無法連線

    可是 相同的程式 用校園的無線網路連線卻可以 應該與程式碼無關吧 ?

    希望各位大大 可以幫忙回答這問題 ? 謝謝
    2007年12月6日 下午 08:51

解答

  • 用 Socket 不用 Winsock 是基於相容度跟整體控管的因素,特別是多緒的情況下。跟是否只能單一連線沒有關連。但 Winsock 控制項由於過度揮霍資源,一般來說大約連線上限約在 512 個連線數。

     

    你 VB6 線上手冊看一下範例就知道,Winscock 在接受連線前,會先 load 一個新的 Winsock 控制項來接受連線,原先 Listen 的控制項是繼續聆聽的,你若是用 Listen 控制項接受連線,當然 Listen 就停掉了,其他連線要求就進不來,自然就是你的程式碼有問題。

     

    用 VBNET Socket 類別寫也是一樣,所以你的問題在於基本觀念錯誤。

    2007年12月6日 下午 11:56
    版主
  • HI,

     

    用Winsock可以搭配TCP協定可以用一個PORT LISTEN多個用戶端的連線需求和多個用戶端連線, 如果使用Winsock搭配UDP協定, 那一個PORT只能和一台電腦連線. 使用TCP協定和使用UDP協定的程式寫法不同, 不能混用

     

    tihs

    2007年12月7日 上午 02:33

所有回覆

  • 用 Socket 不用 Winsock 是基於相容度跟整體控管的因素,特別是多緒的情況下。跟是否只能單一連線沒有關連。但 Winsock 控制項由於過度揮霍資源,一般來說大約連線上限約在 512 個連線數。

     

    你 VB6 線上手冊看一下範例就知道,Winscock 在接受連線前,會先 load 一個新的 Winsock 控制項來接受連線,原先 Listen 的控制項是繼續聆聽的,你若是用 Listen 控制項接受連線,當然 Listen 就停掉了,其他連線要求就進不來,自然就是你的程式碼有問題。

     

    用 VBNET Socket 類別寫也是一樣,所以你的問題在於基本觀念錯誤。

    2007年12月6日 下午 11:56
    版主
  • HI,

     

    用Winsock可以搭配TCP協定可以用一個PORT LISTEN多個用戶端的連線需求和多個用戶端連線, 如果使用Winsock搭配UDP協定, 那一個PORT只能和一台電腦連線. 使用TCP協定和使用UDP協定的程式寫法不同, 不能混用

     

    tihs

    2007年12月7日 上午 02:33
  • 我了解兩位的意思了,

    可是,我的form只有定義一個winsock元件在做listen的動作,

    在ConnectionRequest事件產生後,我就對我的winsock做出close以及accept的動作,

    我有測試過在request產生時,確實可以讓多機連線到此,一旦有一台client被accept後,

    其他台就斷線了.導致其他連線進不來,那麼我該用什麼方法去避免現在這個問題?

    麻煩大大再幫幫忙,THX.

    2007年12月14日 下午 04:06
  • 你到底在 VB6 還 VBNET ?

    VB6 的 Winsock 直接 New 一個 Winsock 控制項,做

    程式碼區塊

    newWinsock.LocalPort = 0

    newWinsock.Accept(requestID)

     

     

    用不到 Close 。

     

    你不把你的程式碼貼出來,網友怎樣幫你除錯呢?

     

    如果你把別的 Winsock 控制項 Close 掉的話,別人當然會被斷線。

     

    2007年12月14日 下午 06:17
    版主
  • HI

     

    只用一個Winsock控制項的程式只能透過UDP進行通訊, 要使用TCP協定進行通訊, SERVER程式必須有一個Winsock控制項進行Listen, 再為每一個連線進來的用戶端程式建立一個專用的Winsock控制項, 不能亂寫

     

    tihs

    2007年12月15日 上午 04:55
  • 對不起,馬上補上我的程式碼-->

     

    程式碼區塊

    Private Sub WskServer_ConnectionRequest(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles WskServer.ConnectionRequest
            ' 檢查 Server Winsock 是否已產生連結?
            If WskServer.CtlState = MSWinsockLib.StateConstants.sckConnected Then
                MessageBox.Show("Server is already connected!", "TCP Server", MessageBoxButtons.OK,  MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
                Exit Sub
            End If

            WskServer.Close()

            ' 接受來自 Client 端的 Request
            WskServer.Accept(e.requestID)

            lblServerStatus.Text = "連線已經建立..."

    Private Sub socket()
            ' 使用 TCP Protocol
            WskServer.Protocol = MSWinsockLib.ProtocolConstants.sckTCPProtocol '傳座標的socket

            lblServerStatus.Text = "聆聽客戶端連線中..."

            ' 設定本 Server 的連接 Port
            WskServer.LocalPort = 5555

            ' 檢查 Winsock 是否已產生連結?
            If WskServer.CtlState <> MSWinsockLib.StateConstants.sckConnected Then
                ' 若未產生連結則產生 Listen
                WskServer.Listen()
            Else
                MessageBox.Show("Server is already connected!", "TCP Server", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
                Exit Sub
            End If
        End Sub        'socket連線

     

     

     

    我是使用vb.net開發的.在form_load的時候,即先做socket()設定listen port=5555,WskServer_ConnectionRequest則是做接受連線的動作.

    2007年12月15日 下午 12:34
  • VBNET 請用 socket 類別,不要用 winsock 控制項。

     

    前面說了,Load 一個新的控制項來接受連線,VB6 線上手冊在 Accept 方法最後一行也有說明:

    程式碼區塊

    應該在新的控制項範例 (不是聆聽狀態下的範例) 中使用 Accept 方法。

     

     

    當你把拿來 Listen 的控制項 close 或 Accept 時,就不在聆聽了,哪怎麼可能同時接聽多個要求?

    就算限制只能單線連接的程式,也未必會這樣寫,因為這樣寫的話,當發生網路異常斷線時,你若沒特別處理就會讓程式空轉,無法再接受連線。

     

    所以在 vbnet 下的 socket 類別中 Accept 時,會直接傳回新的 socket 類別。

    2007年12月15日 下午 03:24
    版主