none
處理接收到的封包的一些問題 RRS feed

  • 問題

  • 上一個問題我發錯地方,

    深感抱歉。

     

    不過還是謝謝 璉大的幫忙

    不過 又遇到了一些問題 所以在來詢問一下Dim s As Socket = Nothing
       

    Code Snippet

    Dim s As Socket = Nothing
        Dim t As Thread
        Dim a As String = ""
        Dim AnyEP As IPEndPoint

        Public Sub WaitData()
            s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Dim localEndPoint As New IPEndPoint(IPAddress.Parse("192.168.1.75"), 1180)
            s.Bind(localEndPoint)
            s.Listen(1)
            While (True)
                Dim bytes(31) As Byte
                Dim ss As Socket = s.Accept()
                ss.Receive(bytes)

                Dim i As Int16 = 0
                For i = 0 To 31
                    a &= Chr(bytes(i))
                Next
                Dim ok(1) As Byte
                ok(0) = Asc("o")
                ok(1) = Asc("k")
                ss.Send(ok, SocketFlags.DontRoute)'<==很偷懶的直接使用回應
            End While
        End Sub

     

    這裡我遇到一個問題

    我使用Ethereal 攔截封包

    發現 在沒有回應OK的時候

    因該要收到6筆相同的資料 機器會狂送

    但是我卻只有收到2筆

    機器在沒有收到OK之前是2秒送一次 會送六次 之後就在等一分鐘後再繼續送

    我顯示的兩筆資料 間格是5~7秒左右

    這是什麼原因呢

    繼續 麻煩各位大大了

     

     

     

    最後在對我發錯地方的文章 道歉

    也謝謝璉大沒有追究我發錯地方的文章

    還幫我解答 感恩^^

    2008年5月29日 上午 01:55

解答

  • HI,

     

    提醒一下, 呼叫Socket的Receive方法前, 請先設定Socket的ReceiveTimeout屬性(單位:毫秒), 以免因為收不到資料而停住, 例如:

     

    Socket物件.Timeout=30000

     

    tihs

    2008年5月31日 上午 04:05
  • 再次謝謝 tihs大大

    因為 是 機器也就是使用者端 跟我建立連線

    我不能主動 與他建立

    所以 我必須在Socket的Receive 也就是收到資料後

    在3秒內 回送OK

    我測試 在Receive 前 或後 送 都沒有成功

    都是CHECKSUM的ERROR

    而使用其他方法 都需要與他建立連線

    目前 先在C8051中 加入 判斷 BYTE=-87

    才達成 我要的目的

     

    2008年6月2日 上午 02:14

所有回覆

  • HI,

     

    呼叫Socket類別的Listen方法是伺服器做的事, 但是您的程式在呼叫Accept之後立刻要接收用戶傳來的資料:

     

    Dim ss As Socket = s.Accept()
    ss.Receive(bytes)

     

    然後來傳回OK給用戶:

     

    Dim ok(1) As Byte
    ok(0) = Asc("o")
    ok(1) = Asc("k")
    ss.Send(ok, SocketFlags.DontRoute)'<==很偷懶的直接使用回應

    不是很清楚您的程式的目的是什麼?

     

    tihs

    2008年5月29日 上午 02:40
  • HI, tihs

     

    程式的目的

    其實就是 把自己的本機電腦 當作伺服器

    所有的機器會透過PORT 1180 傳送即時資訊 回來 本機

    本機在收到後 會回應OK 機器就會等待一分鐘 在送資料回來

     

    不過 就是再

    ss.Send(Encoding.ASCII.GetBytes("ok"), SocketFlags.DontRoute)

    使用軟體監聽 確定 OK 有送出去

    但是感覺機器沒收到 還是 在狂重複測試6次

     

    因為 不然直接 與 機器 連接

    所以 我才使用已建立的通道SS.SEND 來送資料

     

    中午的時候 我在測試 及監聽封包

    發現

    接收到的封包 型態

    與 送出去的封包型態 不同

    我接收到的是[TCP segment of a reassembled PDU]

    我送出去的卻是1180>1180 [PSH, ACK] seq=12343577443 Ack=20361 Win=65439 [TCP CHECKSUM INCORRECT] Len=2

    2008年5月29日 上午 03:04
  •  

    下午實際測試後

    發現 我送初的資料

    在C8051 中 確實 是有送到

    但是 因該是2個BYTE 卻收到-87 也就是ERRCODE

    所以 我在想 可能不能 直接使用以連接的通道 作為傳送OK的通道

    但是我嘗試

     

    'AnyEP = ss.RemoteEndPoint

                'Dim port As Int32 = AnyEP.Port
                'Dim client As New TcpClient(AnyEP.Address.ToString, port)
                'Dim stream As NetworkStream = client.GetStream()
                'Stream.Write(Encoding.ASCII.GetBytes("ok"), 0, Encoding.ASCII.GetBytes("ok").Length)
                'Stream.Close()
                'client.Close()
                'ss.Connect(AnyEP.Address.ToString, port)<==他卻說已經連線了

    所以 各位大大 這個部份 我到底 要 以何種方式 才可以 將"OK"傳給我的機器呢?

     

    麻煩各位大大了

    謝謝

     

    2008年5月29日 上午 06:59
  •  

    最新發現 原來是

    Checksum: 0x846d [incorrect, should be 0x3ee4 (maybe caused by "TCP checksum offload"?)]

     

    Checksum的錯誤

    為何 用SEND 會出現這樣的錯誤呢?

     

    麻煩各位大大了

    2008年5月29日 上午 08:19
  • HI,

     

    如果是樣的話, 就不是在Accept呼叫後就做Receive, 應該是Accept後做Send才對

     

    Dim ss As Socket = s.Accept()
    ss.Receive(bytes)

     

    另外如果用戶端收不到OK, 也有可能是用戶端程式的問題, 您可以參考Microsoft提供的Socket程式範例

    http://msdn.microsoft.com/en-us/vbasic/ms789075.aspx

     

    tihs
    2008年5月30日 上午 01:58
  •  

    謝謝 tihs 大大

    這部份 我在測試看

    先做SEND 在做 Receive 看看是否可以

    感恩^^

     

    不過我確定用戶端有收到

    確定 "OK "有進入

    只不過 在晶片的判斷式中

    是判斷 BYTE=2 所以出現-87的ERCODE 所以 直接跳開IF

    使用封包擷取的軟體 擷取到的則是CHECKSUM ERROR

     

    2008年5月30日 上午 08:52
  • HI,

     

    提醒一下, 呼叫Socket的Receive方法前, 請先設定Socket的ReceiveTimeout屬性(單位:毫秒), 以免因為收不到資料而停住, 例如:

     

    Socket物件.Timeout=30000

     

    tihs

    2008年5月31日 上午 04:05
  • 再次謝謝 tihs大大

    因為 是 機器也就是使用者端 跟我建立連線

    我不能主動 與他建立

    所以 我必須在Socket的Receive 也就是收到資料後

    在3秒內 回送OK

    我測試 在Receive 前 或後 送 都沒有成功

    都是CHECKSUM的ERROR

    而使用其他方法 都需要與他建立連線

    目前 先在C8051中 加入 判斷 BYTE=-87

    才達成 我要的目的

     

    2008年6月2日 上午 02:14