2013-07-29 98 views
0

這是我的課程。我正在做的是 - 我連接2個「會話」,一個連接到我的遊戲客戶端,一個連接到我的服務器,當我從客戶端接收數據時 - 我將它發送到服務器,當我收到數據從服務器 - 我發送給客戶端。出於某種奇怪的原因,我在Visual Studio中遇到錯誤。我擔心這就是爲什麼我不接收來自服務器的任何數據。這是我的課程..我怎麼找到原因?在System.dll中發生第一次機會異常類型SocketException

Imports MapleLib.PacketLib 
Imports System.Threading 
Imports System.Net.Sockets 

Structure Headers 
    Const Login_Appear = "37" 
    Const World_Select = "1C" 
    Const Channel_Select = "2F" 
End Structure 

Public Class InterceptedLinkedClient 

    Private Block As Boolean = False 
    Private CharID As Integer = -1 
    Private Connected As Boolean = True 
    Private GotEncryption As Boolean = False 
    Private Mutex As Mutex = New Mutex 
    Private Mutex2 As Mutex = New Mutex 
    Private inSession As Session 
    Private outSession As Session 
    Private Port As UShort 

    Public Sub New(Inside As Session, pIP As String, pPort As UShort) 
     Port = pPort 
     inSession = Inside 

     AddHandler inSession.OnPacketReceived, AddressOf Inside_OnPacketRecived 
     AddHandler inSession.OnClientDisconnected, AddressOf Inside_OnClientDisconnected 
     'inSession.WaitForData() 

     ConnectOut(pIP, pPort) 
    End Sub 

    Private Sub ConnectOut(IP As String, Port As Integer) 
     Try 
      Dim outSocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
      outSocket.BeginConnect(IP, Port, New AsyncCallback(AddressOf OnOutConnectCallBack), outSocket) 
     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
      OutSession_OnClientDisconnected(Nothing) 
     End Try 
    End Sub 

    Private Sub Inside_OnClientDisconnected(pSession As Session) 
     If outSession IsNot Nothing Then 
      outSession.Socket.Shutdown(SocketShutdown.Both) 
     End If 

     Connected = False 
    End Sub 

    Private Sub Inside_OnPacketRecived(pPacket As Byte()) 
     If Connected AndAlso Not Block Then 
      Mutex.WaitOne() 
      Try 
       Dim Header As String = GetByteArray(pPacket).Substring(0, 2) 
       Select Case Header 
        Case Headers.Login_Appear 
         SendInformation() 

         'Dummy packets (Used for testing). 
         'SendLoginAuth("Admin", "Admin") 
         'SendWorld("Scania") 
         'SendWorldEnd() 
         'Case Headers.World_Select 
         ' SendWorldSelect() 
         'Case Headers.Channel_Select 
         ' ChannelSelect() 
        Case Else 
         outSession.SendPacket(pPacket) 
       End Select 
      Finally 
       Mutex.ReleaseMutex() 
      End Try 
     End If 
    End Sub 

    Private Function GetByteArray(pPacket As Byte(), Optional pEncrypt As Boolean = True) As String 
     Dim ret As String = "" 
     For Each b As Byte In pPacket 
      ret &= String.Format("{0:X2} ", b) 
     Next 

     Return ret 
    End Function 

    Private Sub OnOutConnectCallBack(AR As IAsyncResult) 
     Dim sock As Socket = DirectCast(AR.AsyncState, Socket) 
     Try 
      sock.EndConnect(AR) 
     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
      Connected = False 
      inSession.Socket.Shutdown(SocketShutdown.Both) 
      Return 
     End Try 

     If outSession IsNot Nothing Then 
      outSession.Socket.Close() 
      outSession.Connected = False 
     End If 

     Dim session As Session = New Session(sock, SessionType.CLIENT_TO_SERVER) 
     outSession = session 
     AddHandler outSession.OnInitPacketReceived, AddressOf OutSession_OnInitPacketReceived 
     AddHandler outSession.OnPacketReceived, AddressOf OutSession_OnPacketRecieved 
     AddHandler outSession.OnClientDisconnected, AddressOf OutSession_OnClientDisconnected 
     outSession.WaitForDataNoEncryption() 
    End Sub 

    Private Sub OutSession_OnClientDisconnected(pSession As Session) 
     If Not Block Then 
      inSession.Socket.Shutdown(SocketShutdown.Both) 
      'Log("Out disconnected (" & Port & ").") 
      Connected = False 
     End If 
    End Sub 

    Private Sub OutSession_OnInitPacketReceived(pVersion As Short, pServerIdentifier As Byte, pStr As String) 
     ' MessageBox.Show("Version: " & pVersion & ", Locale: " & pServerIdentifier & ".") 
     SendHandshake() 
    End Sub 

    Private Sub OutSession_OnPacketRecieved(pPacket As Byte()) 
     MessageBox.Show("Got packet from server: " & GetByteArray(pPacket)) 
     If GotEncryption AndAlso Connected Then 
      Mutex2.WaitOne() 
      Try 

       inSession.SendPacket(pPacket) 
      Finally 
       Mutex2.ReleaseMutex() 
      End Try 
     End If 
    End Sub 

    Private Sub SendHandshake() 
     Dim Version As Short = frmMain.Maple_Version 
     Dim rnd As Random = New Random() 
     Dim RecvIV As MapleLib.MapleCryptoLib.MapleCrypto 
     Dim SendIV As MapleLib.MapleCryptoLib.MapleCrypto 
     RecvIV = New MapleLib.MapleCryptoLib.MapleCrypto(BitConverter.GetBytes(rnd.Next()), Version) 
     SendIV = New MapleLib.MapleCryptoLib.MapleCrypto(BitConverter.GetBytes(rnd.Next()), Version) 

     inSession.SIV = SendIV 
     inSession.RIV = RecvIV 

     Dim Packet As PacketWriter = New PacketWriter 
     Packet.WriteShort(14) 
     Packet.WriteShort(Version) 
     Packet.WriteMapleString("1") 
     Packet.WriteBytes(RecvIV.IV) 
     Packet.WriteBytes(SendIV.IV) 
     Packet.WriteByte(8) 
     GotEncryption = True 
     inSession.SendRawPacket(Packet.ToArray) 
     'MessageBox.Show(Packet.ToArray.ToString) 

     'Packet.WriteShort(13 + pStr.Length) 
     'Packet.WriteShort(pVersion) 
     'Packet.WriteMapleString(pStr) 
     'Dim Buffer As Byte() = New Byte(4) {} 
     'Dim Buffer2 As Byte() = New Byte(4) {} 
     'Dim Random As Random = New Random 
     'Random.NextBytes(Buffer) 
     'Random.NextBytes(Buffer2) 
     'inSession.RIV = New MapleLib.MapleCryptoLib.MapleCrypto(Buffer, pVersion) 
     'inSession.SIV = New MapleLib.MapleCryptoLib.MapleCrypto(Buffer2, pVersion) 
     'Packet.WriteBytes(Buffer) 
     'Packet.WriteBytes(Buffer2) 
     'Packet.WriteByte(pServerIdentifier) 
     'GotEncryption = True 
     'inSession.SendRawPacket(Packet.ToArray) 
    End Sub 

    Public Sub SendInformation() 
     Dim Packet As PacketWriter = New PacketWriter 
     'Packet.WriteShort(&H1) 
     Packet.WriteShort(&H2D) 
     'Packet.WriteMapleString(frmMain.Username_) 

     outSession.SendPacket(Packet.ToArray) 
    End Sub 

    Public Sub SendLoginAuth(Username As String, Password As String) 
     Dim Packet As PacketWriter = New PacketWriter 
     Packet.WriteShort(&H0) 

     Packet.WriteInt(0) 
     Packet.WriteShort(0) 
     Packet.WriteInt(0) ' accid 
     Packet.WriteLong(0) 
     Packet.WriteByte(0) 
     Packet.WriteMapleString(Username) 
     Packet.WriteLong(3) 
     Packet.WriteShort(0) 
     Packet.WriteLong(0) 
     Packet.WriteByte(1) 
     Packet.WriteShort(6) 
     Packet.WriteShort(0) 
     Packet.WriteByte(1) 
     Packet.WriteByte(2) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(1) 
     Packet.WriteByte(4) 
     Packet.WriteLong(DateTime.Now.ToFileTimeUtc()) 
     inSession.SendPacket(Packet.ToArray) 
    End Sub 

    Private Sub SendWorldSelect() 
     Dim Packet As PacketWriter = New PacketWriter 
     Packet.WriteShort(&H1C) 
     Packet.WriteByte(1) ' ID 
     Packet.WriteByte(0) 'IDK. 

     inSession.SendPacket(Packet.ToArray) 
    End Sub 

    Private Sub ChannelSelect() 
     Dim Packet As PacketWriter = New PacketWriter 
     Packet.WriteShort(&H1B) 
     Packet.WriteByte(2) 
     Packet.WriteByte(0) ' world id 
     Packet.WriteByte(0) 
     Packet.WriteByte(0) ' Channel id 
     Packet.WriteShort(0) 
     Packet.WriteByte(8) 'IDK. 

     inSession.SendPacket(Packet.ToArray) 
    End Sub 

    Public Sub SendWorld(pName As String) 
     Dim Packet As PacketWriter = New PacketWriter 
     Packet.WriteShort(&H9) 
     Packet.WriteByte(0) ' ID 
     Packet.WriteMapleString(pName) 
     Packet.WriteByte(1) 'Flag. 
     Packet.WriteMapleString("") 
     Packet.WriteShort(100) ' rate modifier. 
     Packet.WriteShort(100) 
     Packet.WriteByte(0) 
     Packet.WriteByte(1) 
     Packet.WriteMapleString(pName & "-1") 
     Packet.WriteInt(0) 
     Packet.WriteByte(0) 
     Packet.WriteShort(0) 
     Packet.WriteShort(0) 
     Packet.WriteInt(0) 

     inSession.SendPacket(Packet.ToArray) 

    End Sub 

    Public Sub SendWorldEnd() 
     Dim Packet As PacketWriter = New PacketWriter 
     Packet.WriteShort(&H9) 
     Packet.WriteByte(&HFF) 
     Packet.WriteByte(0) 

     inSession.SendPacket(Packet.ToArray) 
    End Sub 

    Public Sub Log(Message As String) 
     MessageBox.Show(Message) 
    End Sub 

End Class 

回答

0

可能是多種原因。或者異常是在.Net框架內引起和處理的。所以忽略它,看看你的應用程序是否有效。它可能是防火牆。把它確定下來。你確定你連接到正確的主機+端口?主機是否可以在網絡中ping通?你能用telnet打開端口嗎?

+0

是的。我可以連接到主機,但是,出於某種原因,我沒有收到它的任何數據(數據包)。我想這是因爲例外嗎? – user2628017

相關問題