關於使用winsock(ocx or api)
以UDP協定傳資料的範例是否有人有看過呢 ?
我自己做時有些奇怪的事情
如果用同一個winsock控制項
remotehosp = localip
remoteport = localport
時都好好的
但換成兩個專案(Client,Server)
去run時就根本收不到 ??
by Peter
創作者介紹

小吳 VBQA 程式設計討論

vbqa 發表在 痞客邦 PIXNET 留言(8) 人氣()


留言列表 (8)

發表留言
  • C.C.
  • Client:
    Winsock1.RemoteHost = Winsock1.LocalIP ' Server 的 IP
    Winsock1.RemotePort = 1234 ' Server 所 Bind 的 Port
    Winsock1.SendData "TEST DATA"

    Server:
    Private Sub Form_Load()
    Winsock1.Bind 1234
    End Sub
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim rcvstr As String
    Winsock1.GetData rcvstr
    ' 將收到的資料回送給 Client (測試用)
    Winsock1.RemoteHost = Winsock1.RemoteHostIP
    Winsock1.SendData rcvstr
    End Sub
  • Peter
  • 謝謝啦..
    我沒有bind
    bind到底算是 ?
    平常走TCP不bind好好的 ?
    可不可以解釋一下bind的做用
    by Peter
  • C.C.
  • bind 跟設定 LocalPort 很像.
    只是 bind 有 call socket API 去取得一個 socket handle.
    而設定 LocalPort 只有記住你得設定值, 留到後面 call winsocket API 來用.
    你可從 Winsocke1.SocketHandle 來印證.
    TCP 因為有做 Listen 的動作, 所以只要指定 LocalPort 就可以了.
  • Peter
  • 謝謝 ^__^ 真是受益良多多多
    我個人另外還有一點和vb較無關的問題想問C.C
    一個port可以同時建立連線嗎 ?
    像一般http都用80
    如果同時有兩個人連線的話 ?
    by Peter ^_^
  • C.C.
  • 同時只能有一個程式 bind 同一個 Port.
    但卻可以 accept 很多個 Client connection.
    所以如果你要寫 HTTP Server, 你只要 Bind 80 就可以了.
    然後在 ConnectionRequest 中, RemoteHostIP, RemotePort 會傳回 Client 的資訊.
    你可用 Accept 來接受連線(可用 winsock 陣列來 accept)
    Private Sub WinsockTCP_ConnectionRequest (requestID As Long)
    Dim I As Integer
    For I = 1 to 10
    If Winsock(I).State = sckClosed Then
       Winsock(I).Accept requestID
      End If
    Next
    End Sub
  • Peter
  • 有點弄亂了 ?
    那listen是做啥用的呢 ?
    by Peter
  • C.C.
  • bind 是告訴電腦, 這個 port 為我所用, 其他人不可以用.
    只要有資料要送給這個 Port, 便要通知我.
    UDP 只要 bind 後, 便可接收資料.
    TCP 除了 bind 後, 還需要 Listen 的動作來監聽是否有人要與我建立連線.
    如果有, 電腦會通知程式. 再由程式 call accept 來接收這個連線(也可拒絕)
    一但 accept 後, 連線才算正式完成. 此時才可與對方送收資料.

    轉貼林軍鼎先生的部份文章.
    Stream (TCP) Socket 提供「雙向」、「可靠」、「有次序」、「不重覆」
    之資料傳送。
    Datagram (UDP) Socket 則提供「雙向」之溝通,但沒有「可靠」、「有次
    序」、「不重覆」等之保證; 所以使用者可能會收到無次序、重覆之資料,
    甚至資料在傳輸過程中也可能會遺漏。
    (2) bind():指定 Socket 的 Local 位址 (Address)。
    說明: 此一函式是指定 Local 位址及 Port 給某一未定名之 Socket。
    使用者若不在意位址或 Port 的值,那麼他可以設定位址為 INADDR_ANY,及
    Port 為 0;那麼Windows Sockets 會自動將其設定適當之位址及 Port
    (1024 到 5000之間的值),使用者可以在此 Socket 真正連接完成後,呼
    叫 getsockname() 來獲知其被設定的值。
    (13) listen():設定 Socket 為監聽狀態,準備被連接。
    說明: 使用者可利用此函式來設定 Socket 進入監聽狀態,並設定最多
    可有多少個在未真正完成連接前的彼端的連接要求。(目前最大值限制為 5, 最
    小值為1)
  • Peter
  • 有點懂又好像不懂^^"
    感激C.C的教導!
    by Peter
找更多相關文章與討論