vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Mit System.Net.Sockets über Internet verbinden? 
Autor: dj.tommy
Datum: 14.06.17 18:59

Hallo Leute !
ich möchte mich mittels System.Net.Sockets 2 Rechner verbinden.
Wenn ich mit der IP 127.0.0.1 verbinde funktioniert es.
Möchte ich aber über Internet verbinden, bekomme ich die Meldung Server nicht gefunden.
Ich habe einen UPC Anbieter, die Laut ihre Information kein Sicherheit's Blocker haben.
Und habe zwischen Modem und PC einen Wlan-Router und Kaspersky, die so eingestellt ist, das dieses Programm Erlaubnis zu Internet hat.

Wenn ich nun zuhause mit 2 Pc's, die im Selben Router laufen verbinden möchte, funktioniert es nicht
PC 1 hat die IP 192.168.1.142
PC 2 hat die IP 192.168.1.132
und auch nicht wenn ich vom einem Freund über das Internet verbinden möchte.
Es funktioniert nur, wenn ich die Programme im selben Rechner mit der IP 127.0.0.1 verbinden möchte dann funktioniert es.

Kann mir sagen was der Grund sein kann?

Mfg DjTommy
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Mit System.Net.Sockets über Internet verbinden? 
Autor: sv00010
Datum: 14.06.17 20:03

Eventuell funktioniert es nur mit 127.0.0.1, weil du das was raus sendest selber wieder empfängst.
Um dir helfen zu können brauchen wir mehr Informationen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Mit System.Net.Sockets über Internet verbinden? 
Autor: dj.tommy
Datum: 14.06.17 20:05

Hallo !
Was genau möchtest du wissen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Mit System.Net.Sockets über Internet verbinden? 
Autor: sv00010
Datum: 14.06.17 20:36

dj.tommy schrieb:
Zitat:

Hallo !
Was genau möchtest du wissen?

Eigentlich wäre es am besten du veröffentlichst den bisherigen Quellcode.

Was von Interesse wäre:
Welches Protokoll willst du verwenden?
Hast du den Socket an die IP-Adresse deiner Netzwerkkarte gebunden?
usw.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil1/8 
Autor: dj.tommy
Datum: 15.06.17 13:07

Ich habe dir die kompletten Dateieigenschaften Quell-Code kopiert.
Aber die Form1 habe ich dir nur eine ganz kurze Version geschrieben, denn wenn ich dir die Komplette Chat Programm Quell-Code sende würde diese seine sehr lang werden.
Und es wäre ja vermutlich uninteressant, da es ja nur um die Verbindung geht, und nicht das Chatprogramm an sich.

Dateieigenschaften
Imports System.Net
Imports System.Net.Sockets
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Text
 
<ToolboxBitmap(GetType(Winsock), "Winsock.png")>
<System.ComponentModel.DefaultEvent("HandleError")> _
Public Class Winsock
    Inherits System.ComponentModel.Component
#Region " Variables "
    Private _Paketgröße As Integer = 8192
    Private _LocalHostName As String = Dns.GetHostName ' = ""
    Private _LocalIP As String = LokalHostIP() '"127.0.0.1"
    Private _LocalPort As Integer = 8080
    Private _RemoteIP As String = "127.0.0.1"
    Private _RemoteHostName As String '= 8080
    Private _RemoteHost As String '= 8080
    Private _RemoteHostIP As String '= 8080
    Private _RemotePort As Integer '= 8080
    Private _Status As WinsockStates = WinsockStates.Closed
    Private _bufferCol As Collection
    Private _byteBuffer(_Paketgröße) As Byte
    Private _SocketListTCP As Socket
    Private _SocketListUDP As Socket
    Private _ClientServerTCP As Socket
    Private _ClientServerUDP As Socket
    Private DataBuffer() As Byte
    Private _Tag As String
    Private _BytesReceived As Long = 0
    Private _BytesTotal As Long
    Private _Protokoll As WinsockProtocol
#End Region
 
    Public Sub New()
        _LocalPort = 8080
        _Protokoll = WinsockProtocol.TCP
        _Status = WinsockStates.Closed
        _Paketgröße = 8192
    End Sub
 
#Region " Events "
    ''' <summary>
    ''' Tritt auf, wenn die Verbindungsoperation abgeschlossen ist.
    ''' </summary>
    Public Event Connected(ByVal sender As Winsock)
    ''' <summary>
    ''' Tritt auf, nachdem die Verbindung getrennt wurde.
    ''' </summary>
    Public Event Closend(ByVal sender As Winsock)
    ''' <summary>
    ''' Tritt auf, wenn Daten vom Remote Computer empfangen wurden.
    ''' </summary>
    '''  <param name="BytesTotal">gibt die Daten größe in Bytes zurück.</param>
    Public Event DataArrival(ByVal sender As Winsock, ByVal BytesTotal As Long)
    ''' <summary>
    ''' Tritt auf, wenn ein Remote Client versucht, eine Verbindung 
    ' herzustellen.
    ''' </summary>
    '''  <param name="requestID">gibt die Identität über die Akzeptierte 
    ' Verbindung ab oder legt es fest.</param>
    Public Event ConnectionRequest(ByVal sender As Winsock, ByVal requestID As _
      Socket)
    ''' <summary>
    ''' Tritt auf, wenn die gesendete Daten abgeschlossen ist.
    ''' </summary> 
    Public Event SendComplete(ByVal sender As Winsock)
    ''' <summary>
    ''' Tritt auf, wenn ein Fehler entstanden ist.
    ''' </summary>
    Public Event HandleError(ByVal sender As Winsock, ByVal ErrNumber As _
      Integer, ByVal Description As String)
 
#End Region
 
#Region " Ports "
    ''' <summary>
    '''  Gibt den Anschluß zurück, der auf dem lokalen Computer verwendet wird, 
    ' oder legt den Anschluß fest.
    ''' </summary>
    Public Property LokalPort() As Integer
        Get
            Return _LocalPort
        End Get
        Set(ByVal value As Integer)
            Select Case Status
                Case WinsockStates.Listening
                    Throw New Exception("Können die lokalen Port nicht ändern," & _
                      "während bereits auf einem Port lauscht")
                Case WinsockStates.Connected
                    Throw New Exception("Können die lokalen Port einer" & _
                      "Verbindung, die bereits aktiv ist nicht mehr ändern.")
                Case Else
                    If Status <> WinsockStates.Closed AndAlso Status <> _
                      WinsockStates.Closing Then
                        Throw New Exception("Können die lokalen Port nicht" & _
                        "ändern, während die Komponente verarbeitet, kann es" & _
                        "negative Auswirkungen auf den Verbindungsprozess.")
                    End If
            End Select
            _LocalPort = value
        End Set
    End Property
    ''' <summary>
    '''  Gibt den Anschluß auf dem Remote Computer zurück, über den eine 
    ' Verbindung hergestellt werden soll, oder legt den Anschluß fest.
    ''' </summary>
    <Browsable(False)> _
    Public ReadOnly Property RemotePort() As Integer
        Get
            Return _RemotePort
        End Get
    End Property
 
#End Region
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil2/8 
Autor: dj.tommy
Datum: 15.06.17 13:08

#Region "IP"
 
    ''' <summary>
    '''  Gibt den IP-Adresse auf dem Remote Computer zurück, über den eine 
    ' Verbindung hergestellt werden soll, oder legt den Anschluß fest.
    ''' </summary>
    <Browsable(False)> _
    Public ReadOnly Property RemoteHostIP() As String
        Get
            Return _RemoteIP
        End Get
    End Property
    ''' <summary>
    '''  Gibt den Name auf dem Remote Computer zurück, über den eine Verbindung 
    ' hergestellt werden soll, oder legt den Anschluß fest.
    ''' </summary>
    <Browsable(False)> _
    Public ReadOnly Property RemoteHostName() As String
        Get
            Return _RemoteHostName
        End Get
    End Property
    ''' <summary>
    '''  gibt die IP-Adresse des lokalen Computers zurück.
    ''' </summary>
    <Browsable(False)> _
    Public ReadOnly Property LokalHostIP() As String
        Get
            Return "127.0.0.1"
        End Get
    End Property
    ''' <summary>
    '''  Gibt den Name des lokalen Computers zurück.
    ''' </summary>
    <Browsable(False)> _
    Public ReadOnly Property LokalHostName() As String
        Get
            Return _LocalHostName
        End Get
    End Property
 
#End Region
 
#Region "Senden"
 
    ''' <summary>
    '''  Sendet Daten an den Remote Computer.
    ''' </summary>
    ''' <param name="Data">Übergibt die Daten als String weiter, die 
    ' gesendet werden soll.</param>
    Public Sub SendData(ByVal Data As String)
        If _Protokoll = WinsockProtocol.TCP Then
            Dim sendBytes() As Byte = StringToBytes(Data)
            Me.SendData(sendBytes)
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            Dim sendBytes() As Byte = StringToBytes(Data)
            Me.SendData(sendBytes)
        End If
 
    End Sub
 
    ''' <summary>
    '''  Sendet Daten an den Remote Computer.
    ''' </summary>
    ''' <param name="Data">Übergibt die Daten als Bytes Arrays weiter, die 
    ' gesendet werden soll.</param>
    Public Sub SendData(ByVal Data() As Byte)
        If _Protokoll = WinsockProtocol.TCP Then
            Select Case Status
                Case WinsockStates.Closed
                    MsgBox("Die Verbindung ist geschlossen,  um zu Senden muss" & _
                      "erst eine Verbindung herzustellt werden!", CType(48, _
                      MsgBoxStyle), Application.ProductName)
                Case WinsockStates.Listening
                    'listening
                Case WinsockStates.Connected
                    Try
                        'Dim Header() As Byte = StringToBytes("PL" & 
                        ' SizeToString(Data.Count - 1))
                        '_ClientServerTCP.Send(Header)
                        _ClientServerTCP.Send(Data)
                    Catch ex As Exception
                        Me.Close()
                        ChangeState(WinsockStates.Error)
                        CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                          ex.Message)
                    End Try
            End Select
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            Select Case Status
                Case WinsockStates.Closed
                    MsgBox("Die Verbindung ist geschlossen,  um zu Senden muss" & _
                      "erst eine Verbindung herzustellt werden!", CType(48, _
                      MsgBoxStyle), Application.ProductName)
                Case WinsockStates.Listening
                    'listening
                Case WinsockStates.Connected
                    Try
                        _ClientServerUDP.Send(Data)
                    Catch ex As Exception
                        Me.Close()
                        ChangeState(WinsockStates.Error)
                        CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                          ex.Message)
                    End Try
            End Select
        End If
 
    End Sub
 
#End Region
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil3/8 
Autor: dj.tommy
Datum: 15.06.17 13:09

#Region "Server\Listen"
 
    ''' <summary>
    '''  Wartet auf eingehende Verbindungsanforderungen
    ''' </summary>
    Public Sub Listen()
        Dim x As New System.Threading.Thread(AddressOf DoListen)
        x.Start()
    End Sub
 
    Private Sub DoListen()
        If Status = WinsockStates.Closed Then
            If _Protokoll = WinsockProtocol.TCP Then
                Try
                    _SocketListTCP = New Socket(AddressFamily.InterNetwork, _
                      SocketType.Stream, ProtocolType.Tcp)
                    Dim localAddr As IPAddress = IPAddress.Parse("127.0.0.1")
                    Dim ipLocal As New IPEndPoint(localAddr, LokalPort)
                    _SocketListTCP.Bind(ipLocal)
                    _SocketListTCP.Listen(1)
                    ChangeState(WinsockStates.Listening)
                    _SocketListTCP.BeginAccept(New AsyncCallback(AddressOf _
                      OnClientConnect), Nothing)
                Catch ex As Exception
                    Me.Close()
                    ChangeState(WinsockStates.Error)
                    CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                      ex.Message)
                End Try
            ElseIf _Protokoll = WinsockProtocol.UDP Then
                Try
                    If Socket.OSSupportsIPv4 Then
                        _SocketListUDP = New Socket(AddressFamily.InterNetwork, _
                          SocketType.Dgram, ProtocolType.Udp)
 
                        Dim localAddr As IPAddress = IPAddress.Parse( _
                          "127.0.0.1")
                        Dim ipLocal As New IPEndPoint(localAddr, LokalPort)
                        Dim xe As New UdpReceiveState()
                        xe.SendingSocket = _SocketListUDP
                        xe.ReceivingEndpoint = ipLocal
 
                        _SocketListUDP.Bind(ipLocal)
                        _SocketListUDP.BeginReceiveFrom(_byteBuffer, 0, _
                          _BytesTotal, SocketFlags.None, xe.ReceivingEndpoint, _
                          New AsyncCallback(AddressOf EmpfangServerClientUDP), _
                          xe)
                        ChangeState(WinsockStates.Listening)
                    ElseIf Socket.OSSupportsIPv6 Then
                        _SocketListUDP = New Socket( _
                          AddressFamily.InterNetworkV6, SocketType.Dgram, _
                          ProtocolType.Udp)
 
                        Dim localAddr As IPAddress = IPAddress.Parse( _
                          "127.0.0.1")
                        Dim ipLocal As New IPEndPoint(localAddr, LokalPort)
 
                        Dim xe As New UdpReceiveState()
                        xe.SendingSocket = _SocketListUDP
                        xe.ReceivingEndpoint = ipLocal
 
                        _SocketListUDP.Bind(ipLocal)
                        ChangeState(WinsockStates.Listening)
                        _SocketListUDP.BeginReceiveFrom(_byteBuffer, 0, _
                          _BytesTotal, SocketFlags.None, xe.ReceivingEndpoint, _
                          New AsyncCallback(AddressOf EmpfangServerClientUDP), _
                          xe)
                        ChangeState(WinsockStates.Listening)
                    End If
                Catch ex As Exception
                    Me.Close()
                    ChangeState(WinsockStates.Error)
                    CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                      ex.Message)
                End Try
            End If
        End If
 
 
    End Sub
 
    ''' <summary>
    '''  Akzeptiert eine eingehende Verbindungsanforderung
    ''' </summary>
    ''' <param name="requestID">gibt die Identität über die Akzeptierte 
    ' Verbindung ab oder legt es fest.</param>
    Public Sub Accept(ByVal requestID As Socket)
        If _Protokoll = WinsockProtocol.TCP Then
            Try
                ChangeState(WinsockStates.ConnectionPending)
                _ClientServerTCP = requestID
                ChangeState(WinsockStates.Connected)
                CrossThread.RunGui(AddressOf DoConnected)
                _ClientServerTCP.BeginReceive(_byteBuffer, 0, _Paketgröße, _
                  SocketFlags.None, AddressOf EmpfangServerClientTCP, Nothing)
            Catch ex As Exception
                ChangeState(WinsockStates.Error)
                CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                  ex.Message)
            End Try
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            Beep()
        End If
 
    End Sub
 
#End Region


Beitrag wurde zuletzt am 15.06.17 um 13:09:59 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil4/8 
Autor: dj.tommy
Datum: 15.06.17 13:10

#Region "Client\Connect"
 
    ''' <summary>
    '''  Stellt eine Verbindung zum Remote Computer her.
    ''' </summary>
    Public Sub Connect()
        If _Protokoll = WinsockProtocol.TCP Then
            If Status = WinsockStates.Connected Or Status = _
              WinsockStates.Listening Then
                MsgBox("Verbindung muss erst geschlossen werden um eine" & _
                "Verbindung herzustellen!", CType(48, MsgBoxStyle), _
                Application.ProductName)
                Exit Sub
            End If
            Try
                ChangeState(WinsockStates.HostResolved)
                _ClientServerTCP = New Socket(AddressFamily.InterNetwork, _
                  SocketType.Stream, ProtocolType.Tcp)
                Dim rEP As New IPEndPoint(IPAddress.Parse(LokalHostIP), _
                LokalPort)
                '_ClientServerTCP.Connect(rEP)
                ChangeState(WinsockStates.Connecting)
                _ClientServerTCP.BeginConnect(rEP, New AsyncCallback(AddressOf _
                  OnConnected), Nothing)
            Catch ex As Exception
                ChangeState(WinsockStates.Error)
                CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                  ex.Message)
            End Try
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            If Status = WinsockStates.Connected Or Status = _
              WinsockStates.Listening Then
                MsgBox("Verbindung muss erst geschlossen werden um eine" & _
                "Verbindung herzustellen!", CType(48, MsgBoxStyle), _
                Application.ProductName)
                Exit Sub
            End If
 
            Try
                If Socket.OSSupportsIPv4 Then
                    ChangeState(WinsockStates.HostResolved)
                    _ClientServerUDP = New Socket(AddressFamily.InterNetwork, _
                      SocketType.Dgram, ProtocolType.Udp)
                    Dim rEP As New IPEndPoint(IPAddress.Parse(LokalHostIP), _
                    LokalPort)
                    '_ClientServerTCP.Connect(rEP)
                    ChangeState(WinsockStates.Connecting)
                    _ClientServerUDP.BeginConnect(rEP, New AsyncCallback( _
                      AddressOf OnConnected), Nothing)
                ElseIf Socket.OSSupportsIPv6 Then
                    ChangeState(WinsockStates.HostResolved)
                    _ClientServerUDP = New Socket(AddressFamily.InterNetworkV6, _
                      SocketType.Dgram, ProtocolType.Udp)
                    Dim rEP As New IPEndPoint(IPAddress.Parse(LokalHostIP), _
                    LokalPort)
                    '_ClientServerTCP.Connect(rEP)
                    ChangeState(WinsockStates.Connecting)
                    _ClientServerUDP.BeginConnect(rEP, New AsyncCallback( _
                      AddressOf OnConnected), Nothing)
                End If
            Catch ex As Exception
                ChangeState(WinsockStates.Error)
                CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                  ex.Message)
            End Try
        End If
 
    End Sub
 
    ''' <summary>
    '''  Stellt eine Verbindung zum Remote Computer her.
    ''' </summary>
    ''' <param name="IP">Gibt den Anschluß zurück, der auf dem lokalen 
    ' Computer verwendet wird, oder legt den Anschluß fest.</param>
    ''' <param name="Port">Gibt den Anschluß auf dem Remote Computer zurück, 
    ' über den eine Verbindung hergestellt werden soll, oder legt den Anschluß 
    ' fest.</param>
    ''' 
    Public Sub Connect(ByVal IP As String, ByVal Port As Integer)
        If _Protokoll = WinsockProtocol.TCP Then
            _LocalIP = IP
            _LocalPort = Port
            Connect()
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            Beep()
        End If
 
    End Sub
 
    Private Sub OnClientConnect(ByVal asyn As IAsyncResult)
        If _Protokoll = WinsockProtocol.TCP Then
            Try
                Dim tmpSock As Socket
                If Status = WinsockStates.Listening Then
                    tmpSock = _SocketListTCP.EndAccept(asyn)
                    CrossThread.RunGui(AddressOf DoConnectionRequest, tmpSock)
                    _SocketListTCP.BeginAccept(New AsyncCallback(AddressOf _
                      OnClientConnect), Nothing)
                End If
            Catch ex As Exception
                Me.Close()
                ChangeState(WinsockStates.Error)
                CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                  ex.Message)
            End Try
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            Beep()
        End If
 
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil5/8 
Autor: dj.tommy
Datum: 15.06.17 13:11

    Private Sub OnConnected(ByVal asyn As IAsyncResult)
        If _Protokoll = WinsockProtocol.TCP Then
            Try
                _ClientServerTCP.EndConnect(asyn)
                Me.ClientFinalizeConnection()
            Catch ex As Exception
                ChangeState(WinsockStates.Error)
                CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                  ex.Message)
            End Try
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            Try
                _ClientServerUDP.EndConnect(asyn)
                Me.ClientFinalizeConnection()
            Catch ex As Exception
                ChangeState(WinsockStates.Error)
                CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                  ex.Message)
            End Try
        End If
 
    End Sub
 
    Private Sub ClientFinalizeConnection()
        If _Protokoll = WinsockProtocol.TCP Then
            ChangeState(WinsockStates.Connected)
            _ClientServerTCP.BeginReceive(_byteBuffer, 0, _Paketgröße, _
              SocketFlags.None, AddressOf EmpfangServerClientTCP, Nothing)
            CrossThread.RunGui(AddressOf DoConnected)
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            ChangeState(WinsockStates.Connected)
            _ClientServerUDP.BeginReceive(_byteBuffer, 0, _Paketgröße, _
              SocketFlags.None, AddressOf EmpfangServerClientUDP, Nothing)
            CrossThread.RunGui(AddressOf DoConnected)
        End If
 
    End Sub
 
#End Region
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil6/8 
Autor: dj.tommy
Datum: 15.06.17 13:12

#Region "Zusatz funktionen"
 
    Private Function BytesToString(ByVal Bytes() As Byte) As String
        Dim i As Integer, Str As String = ""
        For i = 0 To UBound(Bytes)
            If Not Bytes(i) = 0 Then
                Str = Str & Chr(Bytes(i))
            End If
        Next
        Return Str
    End Function
 
    Private Function StringToBytes(ByVal Strings As String) As Byte()
        Dim i As Integer, Byt() As Byte = Nothing
        ReDim Byt(Len(Strings) - 1)
        For i = 0 To Len(Strings) - 1
            Byt(i) = Asc(Mid(Strings, i + 1, 1))
        Next
        Return Byt
    End Function
 
    Private Function StringToSize(ByVal str As String, Optional ByVal SynchSafe _
      As Boolean = True) As Double
        Dim Base As Double
        Base = 256 * (2 ^ CDbl(SynchSafe))
        If Len(str) = 4 Then
            Return CDbl(Asc(Mid(str, 4, 1))) * Base ^ CDbl(Len(str) - 4) + CDbl( _
              Asc(Mid(str, 3, 1))) * Base ^ CDbl(Len(str) - 3) + CDbl(Asc(Mid( _
              str, 2, 1))) * Base ^ CDbl(Len(str) - 2) + CDbl(Asc(Mid(str, 1, _
              1))) * Base ^ CDbl(Len(str) - 1) - 1
        ElseIf Len(str) = 3 Then
            Return CDbl(Asc(Mid(str, 3, 1))) * Base ^ CDbl(Len(str) - 3) + CDbl( _
              Asc(Mid(str, 2, 1))) * Base ^ CDbl(Len(str) - 2) + CDbl(Asc(Mid( _
              str, 1, 1))) * Base ^ CDbl(Len(str) - 1) - 1
        End If
        Return ""
    End Function
 
    Private Function SizeToString(ByVal num As Double, Optional ByVal size As _
      Long = 4, Optional ByVal SynchSafe As Boolean = True) As String
        Dim mTmp As Double
        Dim dTmp As Double
        Dim sTmp As String
        Dim Base As Double
 
        dTmp = num
        sTmp = ""
        Base = 256 * (2 ^ CDbl(SynchSafe))
 
        Do
            mTmp = Fix(dTmp / Base)
            sTmp = Chr(CLng(dTmp - Base * mTmp)) & sTmp
            If mTmp = 0 Then Exit Do
            dTmp = mTmp
        Loop
        If Len(sTmp) > size Then
            SizeToString = Right(sTmp, size)
        Else
            SizeToString = New String(Chr(0), size - Len(sTmp)) & sTmp
        End If
    End Function
 
#End Region
 
#Region "Events"
 
    ''' <summary>
    '''  Gibt den IP-Adresse auf dem Remote Computer zurück, über den eine 
    ' Verbindung hergestellt werden soll, oder legt den Anschluß fest.
    ''' </summary>
    Public Property Paketgröße() As Long
        Get
            Return _Paketgröße
        End Get
        Set(ByVal Value As Long)
            If Status = WinsockStates.Closed Then
                _Paketgröße = Value
            Else
                Throw New Exception("Die Verbindung ist nicht geschlossen," & _
                  "daher kann dieser IP nicht gesetzt werden.")
            End If
        End Set
    End Property
 
    ''' <summary>
    ''' Gibt das Socket-Protokoll zurück oder legt es fest.
    ''' </summary>
    <RefreshProperties(RefreshProperties.All)> _
    Public Property Protokoll() As WinsockProtocol
        Get
            Return _Protokoll
        End Get
        Set(ByVal value As WinsockProtocol)
            If Status <> WinsockStates.Closed Then
                Throw New Exception("Cannot change the protocol while listening" & _
                  "or connected to a remote computer.")
            End If
            _Protokoll = value
        End Set
    End Property
 
    ''' <summary>
    '''  Bindet den Socket an einen bestimmten Anschluß und eine bestimmte 
    ' Netzwerkkarte.
    ''' </summary>
    ''' <param name="Port">Gibt den Anschluß auf dem Remote Computer zurück, 
    ' über den eine Verbindung hergestellt werden soll, oder legt den Anschluß 
    ' fest.</param>
    ''' <param name="IP">Gibt den Anschluß zurück, der auf dem lokalen 
    ' Computer verwendet wird, oder legt den Anschluß fest.</param>
    Public Sub Bind(ByVal Port As Integer, IP As String)
        _LocalIP = IP
        _LocalPort = Port
        Connect()
    End Sub
 
    ''' <summary>
    '''  Gibt die Anzahl der über diese Verbindung empfangenen Bytes zurück.
    ''' </summary>
    Public Function BytesReceived() As Long
        Return _BytesReceived
    End Function
 
    ''' <summary>
    '''Speichert alle zusätzlichen Daten, die Sie für Ihr Programm benötigen.
    ''' </summary>
    Public Property Tag() As String
        Get
            Return _Tag
        End Get
        Set(ByVal Value As String)
            If Status <> WinsockStates.Connected Then
                _Tag = Value
            Else
                Throw New Exception("Can't be connected to a server and change" & _
                  "the remote port.")
            End If
        End Set
    End Property


Beitrag wurde zuletzt am 15.06.17 um 13:13:34 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil7/8 
Autor: dj.tommy
Datum: 15.06.17 13:15

    Private Sub ChangeState(ByVal new_state As WinsockStates)
        _Status = new_state
    End Sub
 
    ''' <summary>
    '''  gibt den Zustand der Socket-Verbindung zurück
    ''' </summary>
    <Browsable(False)> Public ReadOnly Property Status() As WinsockStates
        Get
            Return _Status
        End Get
    End Property
 
    ''' <summary>
    '''  Tritt auf, wenn ein Verbindung geschlossen wird.
    ''' </summary>
    Public Sub Close()
        If _Protokoll = WinsockProtocol.TCP Then
            Try
                Select Case Status
                    Case WinsockStates.Listening
                        ChangeState(WinsockStates.Closing)
                        _SocketListTCP.Close()
                    Case WinsockStates.Connected, WinsockStates.Connecting, _
                      WinsockStates.ConnectionPending, _
                      WinsockStates.HostResolved, WinsockStates.Open, _
                      WinsockStates.ResolvingHost
                        ChangeState(WinsockStates.Closing)
                        _ClientServerTCP.Close()
                    Case WinsockStates.Closed
                        'do nothing
                End Select
                ChangeState(WinsockStates.Closed)
            Catch ex As Exception
                ChangeState(WinsockStates.Error)
                CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
                  ex.Message)
            End Try
        ElseIf _Protokoll = WinsockProtocol.UDP Then
            Beep()
        End If
 
    End Sub
 
#End Region
 
End Class
 
#Region " WinsockStates "
 
Public Enum WinsockStates
    Closed = 0
    Open = 1
    Listening = 2
    ConnectionPending = 3
    ResolvingHost = 4
    HostResolved = 5
    Connecting = 6
    Connected = 7
    Closing = 8
    [Error] = 9
    'Listening = 1
    'Connected = 2
End Enum
 
Public Enum WinsockProtocol
    ''' <summary>
    ''' ist eine sicher Verbindung
    ''' </summary>
    TCP = 0
    ''' <summary>
    ''' ist ein unsicher Verbindung
    ''' </summary>
    UDP = 1
End Enum
 
#End Region
 
Public Class UdpReceiveState
 
    ''' <summary>
    ''' The incoming socket information - allows UDP to determine the sender.
    ''' </summary>
    Public SendingSocket As Object
    ''' <summary>
    ''' The EndPoint on which the data was received (server side).
    ''' </summary>
    Public ReceivingEndpoint As EndPoint
 
End Class
 
#Region "Um keine Threadübergreifend zu verursachen"
 
Public Class CrossThread
 
    Public Shared Sub RunAsync(Of T1, T2, T3)(ByVal Action As Action(Of T1, T2, _
      T3), ByVal Arg1 As T1, ByVal Arg2 As T2, ByVal Arg3 As T3)
        ' Aufruf von Action.EndInvoke() gewährleisten, indem er als 
        '  Callback-Argument mitgegeben wird
        Action.BeginInvoke(Arg1, Arg2, Arg3, AddressOf Action.EndInvoke, _
          Nothing)
    End Sub
 
    Public Shared Sub RunAsync(Of T1, T2)(ByVal Action As Action(Of T1, T2), _
      ByVal Arg1 As T1, ByVal Arg2 As T2)
        Action.BeginInvoke(Arg1, Arg2, AddressOf Action.EndInvoke, Nothing)
    End Sub
 
    Public Shared Sub RunAsync(Of T1)(ByVal Action As Action(Of T1), ByVal Arg1 _
      As T1)
        Action.BeginInvoke(Arg1, AddressOf Action.EndInvoke, Nothing)
    End Sub
 
    Public Shared Sub RunAsync(ByVal Action As Action)
        Action.BeginInvoke(AddressOf Action.EndInvoke, Nothing)
    End Sub
 
    Private Shared Function GuiCrossInvoke(ByVal Action As [Delegate], ByVal _
      ParamArray Args() As Object) As Boolean
 
        If Application.OpenForms.Count = 0 Then
            ' Wenn kein Form mehr da ist, so tun, als ob das Invoking 
            '  ausgeführt wäre
            Return True
        End If
        If Application.OpenForms(0).InvokeRequired Then
            Application.OpenForms(0).BeginInvoke(Action, Args)
            Return True
        End If
        Return False
    End Function
 
    Public Shared Sub RunGui(Of T1, T2, T3)(ByVal Action As Action(Of T1, T2, _
      T3), ByVal Arg1 As T1, ByVal Arg2 As T2, ByVal Arg3 As T3)
        ' Falls Invoking nicht erforderlich, die Action direkt ausführen
        If Not GuiCrossInvoke(Action, Arg1, Arg2, Arg3) Then
            Action(Arg1, Arg2, Arg3)
        End If
    End Sub
 
    Public Shared Sub RunGui(Of T1, T2)(ByVal Action As Action(Of T1, T2), _
      ByVal Arg1 As T1, ByVal Arg2 As T2)
        If Not GuiCrossInvoke(Action, Arg1, Arg2) Then Action(Arg1, Arg2)
    End Sub
 
    Public Shared Sub RunGui(Of T1)(ByVal Action As Action(Of T1), ByVal Arg1 _
      As T1)
        If Not GuiCrossInvoke(Action, Arg1) Then Action(Arg1)
    End Sub
 
    Public Shared Sub RunGui(ByVal Action As Action)
        If Not GuiCrossInvoke(Action) Then Action()
    End Sub
 
End Class
 
#End Region
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil8/8 
Autor: dj.tommy
Datum: 15.06.17 13:16

Form1
Private Sub WS_DataArrival(sender As Winsock, BytesTotal As Long) Handles _
  WS.DataArrival
Dim Empfang As String = ""
WS.GetData(Empfang)
Msgbox(Empfang)
End Sub
 
Private Sub WS_ConnectionRequest(sender As Winsock, requestID As Socket) _
  Handles WS.ConnectionRequest
WS.Accept(requestID)
End Sub
 
Private Sub WS_Connected(sender As Winsock) Handles WS.Connected
Msgbox ("Verbunden")
End Sub
 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
  Button1.Click
WS.SendData("Hallo")
End Sub
 
Private Sub Ws_HandleError(sender As Winsock, ErrNumber As Integer, Description _
  As String)
MsgBox("Der Server ist derzeit nicht erreichbar!" & vbNewLine & "Bitte warten" & _
"Sie bis der Server Online gegangen ist, oder wenn der Server Online ist," & _
"Überprüfen Sie die Verbindung!", CType(48, MsgBoxStyle), _
Application.ProductName)
End Sub
Ich hoffe du findest den Fehler.

Danke im Vorraus
Mfg DjTommy

PS: Solltest du dennoch Interesse an diesem Chat Programm haben, dann gib mir bitte Bescheid und ich gebe es dir sobald es Funktioniert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil8/8 
Autor: sv00010
Datum: 15.06.17 14:44

Zitat:


_SocketListUDP.BeginReceiveFrom(_byteBuffer, 0, _
_BytesTotal, SocketFlags.None, xe.ReceivingEndpoint, _
New AsyncCallback(AddressOf EmpfangServerClientUDP), _
xe)


Ich verwende UDP, mit TCP habe ich leider noch nicht gearbeitet.
Ich glaube statt xe.ReceivingEndpoint muss ein Endpoint angegeben werden der für die IPAdresse
0.0.0.0 (alle IP-Adressen) ist.
https://msdn.microsoft.com/de-de/library/system.net.ipaddress.any(v=vs.110).aspx
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil8/8 
Autor: dj.tommy
Datum: 16.06.17 16:18

Hallo!
unter xe.ReceivingEndpoint ist ja die IP vorhanden.
Wenn ich nur Endpoint eingebe ist ein Fehler, was auch klar ist, da Endpoint nicht deklariert ist.
also an dem kann es nicht liegen.

Auserdem bevorzuge ich lieber TCP als UDP , da TCP eine sichere Verbindung als UDP ist.

Mfg DjTommy
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil8/8 
Autor: sv00010
Datum: 16.06.17 21:30

dj.tommy schrieb:
Zitat:

Hallo!
Wenn ich nur Endpoint eingebe ist ein Fehler, was auch klar
ist, da Endpoint nicht deklariert ist.
also an dem kann es nicht liegen.
Mfg DjTommy

Ich meinte damit, du solltest einen neuen IPEndpoint für die IP-Adresse System.Net.IPAddress.Any (0.0.0.0) erstellen und dort angeben.
https://msdn.microsoft.com/de-de/library/k17zbw22(v=vs.110).aspx
Du willst ja nicht nur von 127.0.0.1 Daten empfangen können, sondern von überall.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Quellcode Teil8/8 
Autor: dj.tommy
Datum: 18.06.17 18:03

Hallo sv00010 !
Jetzt hat es funktioniert
das und noch ein Fehler entdeckt, und das ich da nicht gleich drauf gekommen bin weiß ich auch nicht:-D
denn ich Dummerchen habe auch unter Connect LokalIp statt RemoteIp eingegeben.

Danke für deine Hilfe.

Mfg DjTommy
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Sockets Empfänger 
Autor: dj.tommy
Datum: 02.07.17 12:14

Hallo!
Ich habe leider noch eine Frage zu den Empfänger.
Ich arbeite mit Socket Asynchron
der Server und der Client Senden und Empfangen mit der Paketgröße von 10240 Kb

Nun wenn ich ein Mp3 Datei versende, wird mit der Prozedur:
'Der Code ist eine kurz Version
Public Sub Send(ByVal Data() As Byte)
_SocketSend.BeginSend(Buffer, 0, Buffer.Length, SocketFlags.None, New _
  AsyncCallback(AddressOf SendCallback), _Status)'Sende Erste Blockdaten
End Sub
 
Private Sub SendCallback(ByVal ar As IAsyncResult)
_SocketSend.BeginSend(Buffer, 0, Buffer.Length, SocketFlags.None, New _
  AsyncCallback(AddressOf SendCallback), _Status)'Sende weitere Blockdaten
End Sub
Blockweise versendet.
z.B: wird die Prozedur SendCallback 20 mal ausgelöst, damit die komplette Datei versendet wird.

Des Empfangs Prozedur
'Der Code ist eine kurz Version
Private Sub Empfänger(ByVal ar As IAsyncResult)
  Dim intCount as Integer = CInt(_SocketEmpfang.EndReceive(ar))'Paketgröße
_SocketEmpfang.BeginReceive(_ReceivebyteBuffer, 0, _Paketgröße, _
  SocketFlags.None, AddressOf Empfänger, _SocketEmpfang)
End Sub
Die Prozedur Empfänger wird öfter als 20 mal ausgelöst.
Der Grund ist, weil die empfangenen Daten nicht die Pakete Größe haben als vorgegeben ist.
In der Variable intCount steht mal 8192 dann mal 5089 oder auch 10240 etc.
also die Paketgröße in der Variable intCount schwanken.

Jetzt habe ich das Problem!
Das wenn SendCallback ausgelöst wird, weiß man nicht wie oft der Empfänger ausgelöst wird.
Damit er alles hat.
Warum möchte ich das jetzt wissen will?
Ich habe vor bei jeden, Senden ein Header mitzusenden.
Um Information an dem Empfänger mitzuteilen während der Daten Transfer.

Um es zu verdeutlichen worauf ich jetzt hinaus will
wenn der SendCallback Prozedur
z.b: 2 Block mit Header + Daten versendet
Bildlich gesehen:
()= pro Versendung
(Header + Daten),(Header + Daten) etc.
Empfängt der Empfänger
z.B: 20 Blöcke
Bildlich gesehen:
()= pro Empfang
(Header +Daten),(Daten),(Daten),(Daten),(Daten),(Header + Daten) etc.
und wie soll man durch viele Blöcke wissen können, was und wo ist jetzt der Header?
Ich möchte den Header am Anfang haben, um Fehler von Datentransfer zu vermeinten.

Ich hoffe das hier mich verstanden habt, und ihr vielleicht mir helfen bzw. Hinweise geben könnt.
Danke im vorraus!
Mfg DjTommy
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Sockets Empfänger 
Autor: sv00010
Datum: 02.07.17 17:52

Zitat:


(Header +Daten),(Daten),(Daten),(Daten),(Daten),(Header + Daten) etc.
und wie soll man durch viele Blöcke wissen können, was und wo ist jetzt der Header?
Ich möchte den Header am Anfang haben, um Fehler von Datentransfer zu vermeinten.

Der Header muss immer gleich lang sein und alle Arten von Befehlen enthalten können, welche du brauchst.
Der Header muss bei jedem Datenpaket mitgesendet werden, egal ob logisch benötigt oder nicht.
Dies soll so sein, damit immer die gleiche Anzahl von Bytes den Header darstellen und die Daten
bei jedem Paket immer an der gleichen Stelle anfangen (wegen Fehleranfälligkeit).

Dazu musst du dir Gedanken machen.
z.B.
Befehl-ID: UShort oder Integer
Von: Integer oder Long
Bis: Integer oder Long
usw.

Der erste Datensatz könnte dann so lauten:
1. Befehl-ID für Datei senden in Bytearray von der Länge des Datentyps erstellen
(4 bzw. 8 Bytes).
2. Bytearray für Von erstellen (beim ersten Datenpaket 0, bei weiteren Datenpaketen der Index im Bytearray der Datei wo es weitergeht).
3. Bytearray für Bis erstellen (bis wohin wird geschrieben).
usw.

4. Dann die ganzen einzelnen Header-Bytearrays in ein Gesamt-Header-Bytearray kopieren.
5. Am Ende das Gesamt-Header-Bytearray und den zu sendenden Inhalt zu einem Gesamtarray zusammenfügen.

Das Konzept ist noch nicht so richtig ausgereift, z.B. könnte man auch Von als zweites nehmen und dann eine Länge in Bytes, statt Bis.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Sockets Empfänger 
Autor: dj.tommy
Datum: 02.07.17 19:02

Hallo sv00010!
Ich weiß jetzt nicht ob wir uns vorbeireden.
Natürlich sende ich immer die, gleiche Paket Größe mit Header und Daten
aber der Empfänger bekommt es nicht so wie es weg gesendet wurde.

Wie gesagt wenn der Sender 1 mal ein Paket mit der Paketgröße von 10240 Kb versendet,

Kommt der Empfänger beispielsweise
3 mal Empfangen
einmal 8192 und zum zweiten mal 2048 und zum Dritten mal 0

Aber Moment mal

Meinst du vielleicht das ich im Header auch die Information geben soll, das der Empfänger weiß wie groß Paket sich selbst 10240 Kb groß ist.

Und nicht nur die Paketgröße der gesamte Dateitransfer?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Sockets Empfänger 
Autor: sv00010
Datum: 03.07.17 05:42

dj.tommy schrieb:
Zitat:


Wie gesagt wenn der Sender 1 mal ein Paket mit der Paketgröße
von 10240 Kb versendet,

Kommt der Empfänger beispielsweise
3 mal Empfangen
einmal 8192 und zum zweiten mal 2048 und zum Dritten mal 0

Vermutlich haben wir wirklich aneinander vorbei geredet.
Das mit den gesplitteten Bytes liegt vermutlich am SendBufferSize und ReceiveBufferSize.
Diese müssen dann auch auf die Größe von 10240 eingestellt werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Sockets Empfänger 
Autor: dj.tommy
Datum: 03.07.17 10:32

Ja das witzige ist, das die Paketgröße unter Server und Client die gleiche größe haben

Dim Paketgröße as Integer=10240
_SocketEmpfang.BeginReceive(_ReceivebyteBuffer, 0, _Paketgröße, _
  SocketFlags.None, AddressOf Empfänger,_SocketEmpfang)
 
_SocketSend.BeginReceive(_ReceivebyteBuffer, 0, _Paketgröße, SocketFlags.None, _
  AddressOf Empfänger,_SocketSend)
Die Codeteile BeginReceive sind alle gleich, also unter (Listen, Accept, Connected, Empfänger)
Habe ich etwas übersehen?
Außer das ich vergessen habe das ich im Form1 den Wert Paket von 10240 auf 524288 gesetzt habe, damit die Übertragung schneller abläuft.
Aber es ändert sich nichts daran, der Server und Client verschiedene Paketgröße haben.

Aber wenn, ich mir so recht überlege ist es sowieso keine blöde Idee die Paketgröße in Header mitzugeben.
Um auch zu vermeinten das "wenn" der Server und Client verschiedene Paketgröße haben, das keine böse Überraschung gibt.

Aber vielen Dank für den Gedanken Anstoß sv00010!
Mfg DjTommy

Beitrag wurde zuletzt am 03.07.17 um 10:35:17 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Sockets Empfänger 
Autor: sv00010
Datum: 03.07.17 17:35

Zitat:


Außer das ich vergessen habe das ich im Form1 den Wert Paket
von 10240 auf 524288 gesetzt habe, damit die Übertragung
schneller abläuft.

Ich hatte vor langer Zeit mal unter Windows XP mit UDP und Übertragungart System.Net.Sockets.SocketType.Dgram herausbekommen, dass das größte Datenpaket was korrekt übertragen wurde, bei 65507 Bytes lag.
Um TCP hatte ich mich damals nicht gekümmert, aber das wäre eventuell auch für dich interessant.
Mit kleinen Paketen anfangen und dann immer weiter vergrößern bis zur maximal funktionierenden Paketgröße.

Beitrag wurde zuletzt am 03.07.17 um 17:43:47 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Sockets Empfänger 
Autor: dj.tommy
Datum: 03.07.17 19:35

Ja stimmt bei kleineren Paketen stimmt die Übertragung.
Aber ich habe dank einer Gedanken stoß, trotzdem erschlossen, das ich die eigene Paketgröße mit in den Header mit eintrage, denn sollte mal was sein, hat man dann keine Probleme.
Mfg DjTommy
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel