| |
VB.NET - FortgeschritteneMit 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 | |
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. | |
Re: Mit System.Net.Sockets über Internet verbinden? | | | Autor: dj.tommy | Datum: 14.06.17 20:05 |
| Hallo !
Was genau möchtest du wissen? | |
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. | |
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 | |
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 | |
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. | |
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 | |
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 | |
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. | |
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 | |
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. | |
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 | |
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 | |
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. | |
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 | |
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 | |
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. | |
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? | |
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. | |
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. | |
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. | |
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 | |
| 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 |
|
|
sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|