获取错误"通常只允许使用每个套接字地址(协议/网络地址/端口)"在vb.net 10

时间:2014-03-31 03:24:54

标签: vb.net sockets tcpclient tcplistener

我正在制作一个简单的tcp通信程序,只是为了发送我不断回收的字符串

  

通常只允许使用每个套接字地址(协议/网络地址/端口)

我在Windows 8上运行了完全相同的代码,但是在它的情况下工作正常,但在7我得到这个错误。(我需要它在7上运行) 这是我的代码(这是一种不会造成任何伤害的假病毒): {

  Imports IWshRuntimeLibrary

Public Class Form1
Dim virus As Boolean = False
'Public IsClosing As Boolean = False
Private _Server As New TcpCommServer(AddressOf UpdateUI)
Private _Server2 As New TcpCommServer(AddressOf UpdateUI2)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    _Server.Start(32800)
    _Server2.Start(32801)
    If My.Settings.autostart = False Then
        Dim startupPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Startup)
        Dim executablePath As String = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
        Dim executableName As String = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName
        'create shortcut
        Dim Shell As WshShell
        Dim Link As WshShortcut
        Try
            Shell = New WshShell
            Link = CType(Shell.CreateShortcut(startupPath & "\" & executableName & ".lnk"), IWshShortcut)
            Link.TargetPath = executablePath
            Link.Save()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        My.Settings.autostart = True
    ElseIf My.Settings.autostart = True Then

    End If
End Sub




Private Function BytesToString(ByVal data() As Byte) As String
    Dim enc As New System.Text.UTF8Encoding()
    BytesToString = enc.GetString(data)
End Function

Private Function StrToByteArray(ByVal text As String) As Byte()
    Dim encoding As New System.Text.UTF8Encoding()
    StrToByteArray = encoding.GetBytes(text)
End Function
Private Function BytesToString2(ByVal data() As Byte) As String
    Dim enc2 As New System.Text.UTF8Encoding()
    BytesToString2 = enc2.GetString(data)
End Function

Private Function StrToByteArray2(ByVal text As String) As Byte()
    Dim encoding2 As New System.Text.UTF8Encoding()
    StrToByteArray2 = encoding2.GetBytes(text)
End Function

Public Sub UpdateUI(ByVal bytes() As Byte, ByVal sessionID As Int32, ByVal dataChannel As Integer)

    If Me.InvokeRequired() Then
        ' InvokeRequired: We're running on the background thread. Invoke the delegate.
        Me.Invoke(_Server.ServerCallbackObject, bytes, sessionID, dataChannel)
    Else
        ' We're on the main UI thread now.
        If dataChannel = 1 Then
            Me.lbtextinput.Text = (BytesToString(bytes))
        ElseIf dataChannel = 255 Then
            Dim tmp = ""
            Dim msg As String = BytesToString(bytes)
            Dim dontReport As Boolean = False

            ' _Server as finished sending the bytes you put into sendBytes()
            If msg.Length > 3 Then tmp = msg.Substring(0, 3)
            If tmp = "UBS" Then ' User Bytes Sent.
                Dim parts() As String = Split(msg, "UBS:")
                msg = "Data sent to session: " & parts(1)
            End If


        End If
    End If

End Sub
Public Sub UpdateUI2(ByVal bytes() As Byte, ByVal sessionID As Int32, ByVal dataChannel As Integer)

    If Me.InvokeRequired() Then
        ' InvokeRequired: We're running on the background thread. Invoke the delegate.
        Me.Invoke(_Server2.ServerCallbackObject, bytes, sessionID, dataChannel)
    Else
        ' We're on the main UI thread now.
        If dataChannel = 1 Then

            MsgBox(BytesToString2(bytes))
        ElseIf dataChannel = 255 Then
            Dim tmp = ""
            Dim msg As String = BytesToString2(bytes)
            Dim dontReport As Boolean = False

            ' _Server as finished sending the bytes you put into sendBytes()
            If msg.Length > 3 Then tmp = msg.Substring(0, 3)
            If tmp = "UBS" Then ' User Bytes Sent.
                Dim parts() As String = Split(msg, "UBS:")
                msg = "Data sent to session: " & parts(1)
            End If


        End If
    End If

End Sub









Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    If lbtextinput.Text = "Start Virus" Then
        virus = True
    ElseIf lbtextinput.Text = "Stop Virus" Then
        virus = False
    End If
End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    If virus = True Then
        Form2.Show()
    Else
        Form2.Hide()
    End If
End Sub
End Class

} Form1

现在是一个链接类{

Imports System.IO
Imports System.Runtime.InteropServices

 Public Class clsAsyncUnbuffWriter



Public Class clsSystemInfo

    Private Class WinApi
        <DllImport("kernel32.dll")> _
        Public Shared Sub GetSystemInfo(<MarshalAs(UnmanagedType.Struct)> ByRef     lpSystemInfo As SYSTEM_INFO)
        End Sub

        <StructLayout(LayoutKind.Sequential)> _
        Public Structure SYSTEM_INFO
            Friend uProcessorInfo As _PROCESSOR_INFO_UNION
            Public dwPageSize As UInteger
            Public lpMinimumApplicationAddress As IntPtr
            Public lpMaximumApplicationAddress As IntPtr
            Public dwActiveProcessorMask As IntPtr
            Public dwNumberOfProcessors As UInteger
            Public dwProcessorType As UInteger
            Public dwAllocationGranularity As UInteger
            Public dwProcessorLevel As UShort
            Public dwProcessorRevision As UShort
        End Structure

        <StructLayout(LayoutKind.Explicit)> _
        Public Structure _PROCESSOR_INFO_UNION
            <FieldOffset(0)> _
            Friend dwOemId As UInteger
            <FieldOffset(0)> _
            Friend wProcessorArchitecture As UShort
            <FieldOffset(2)> _
            Friend wReserved As UShort
        End Structure
    End Class

    Public Shared Function GetPageSize() As Integer
        Dim sysinfo As New WinApi.SYSTEM_INFO()
        WinApi.GetSystemInfo(sysinfo)
        Return CInt(sysinfo.dwPageSize)
    End Function
End Class

Private target As FileStream
Private inputBuffer As MemoryStream
Private bufferSize As Integer
Private running As Boolean
Private writing As Boolean
Private readWait As Threading.ManualResetEvent
Private writeWait As Threading.ManualResetEvent
Private finishedWriting As Threading.ManualResetEvent
Private totalWritten As Int64
Private writeTimer As Stopwatch

Public Function GetTotalBytesWritten() As Int64
    Return totalWritten
End Function

Public Function IsRunning() As Boolean
    Return running
End Function

Public Sub Close()
    writing = False
    writeWait.Set()
    finishedWriting.WaitOne()
    readWait.Set()
End Sub

Public Function GetActiveMiliseconds() As Int64
    Try
        Return writeTimer.ElapsedMilliseconds
    Catch ex As Exception
        Return 0
    End Try
End Function

Public Shared Function GetPageSize() As Integer
    Return clsSystemInfo.GetPageSize
End Function

Public Sub New(ByVal dest As String, _
            Optional ByVal unbuffered As Boolean = False, _
            Optional ByVal _bufferSize As Integer = (1024 * 1024), _
            Optional ByVal setLength As Int64 = 0)

    bufferSize = _bufferSize
    Dim options As FileOptions = FileOptions.SequentialScan
    If unbuffered Then options = FileOptions.WriteThrough Or FileOptions.SequentialScan
    readWait = New Threading.ManualResetEvent(False)
    writeWait = New Threading.ManualResetEvent(False)
    finishedWriting = New Threading.ManualResetEvent(False)

    readWait.Set()
    writeWait.Reset()
    finishedWriting.Reset()

    target = New FileStream(dest, _
                                    FileMode.Create, FileAccess.Write, FileShare.None, GetPageSize, options)
    If setLength > 0 Then target.SetLength(setLength)

    totalWritten = 0
    inputBuffer = New MemoryStream(bufferSize)
    running = True
    writing = True
    writeTimer = New Stopwatch

    Dim asyncWriter As New Threading.Thread(AddressOf WriteThread)

    With asyncWriter
        .Priority = Threading.ThreadPriority.Lowest
        .IsBackground = True
        .Name = "AsyncCopy writer"
        .Start()
    End With

End Sub

Public Function Write(ByVal someBytes() As Byte, ByVal numToWrite As Integer) As Boolean
    If Not running Then Return False
    If numToWrite < 1 Then Return False

    If numToWrite > inputBuffer.Capacity Then
        Throw New Exception("clsAsyncUnbuffWriter: someBytes() can not be larger then buffer capacity")
    End If

    If (inputBuffer.Length + numToWrite) > inputBuffer.Capacity Then
        If inputBuffer.Length > 0 Then
            readWait.Reset()
            writeWait.Set()
            readWait.WaitOne()
            If Not running Then Return False
            inputBuffer.Write(someBytes, 0, numToWrite)
        End If
    Else
        inputBuffer.Write(someBytes, 0, numToWrite)
    End If

    Return True
End Function

Private Sub WriteThread()

    Dim bytesThisTime As Int32 = 0
    Dim internalBuffer(bufferSize) As Byte

    writeTimer.Stop()
    writeTimer.Reset()
    writeTimer.Start()

    Do
        writeWait.WaitOne()
        writeWait.Reset()

        bytesThisTime = CInt(inputBuffer.Length)

        Buffer.BlockCopy(inputBuffer.GetBuffer, 0, internalBuffer, 0, bytesThisTime)

        inputBuffer.SetLength(0)
        readWait.Set()

        target.Write(internalBuffer, 0, bytesThisTime)
        totalWritten += bytesThisTime

    Loop While writing

    ' Flush inputBuffer
    If inputBuffer.Length > 0 Then
        bytesThisTime = CInt(inputBuffer.Length)
        Buffer.BlockCopy(inputBuffer.GetBuffer, 0, internalBuffer, 0, bytesThisTime)
        target.Write(internalBuffer, 0, bytesThisTime)
        totalWritten += bytesThisTime
    End If

    running = False
    writeTimer.Stop()
    finishedWriting.Set()

    Try
        target.Close()
        target.Dispose()
    Catch ex As Exception
    End Try

    inputBuffer.Close()
    inputBuffer.Dispose()
    inputBuffer = Nothing
    internalBuffer = Nothing
    target = Nothing

    GC.GetTotalMemory(True)
End Sub
End Class

}公共类clsAsyncUnbuffWriter

现在我还有一大块代码,但它不适合所以我稍后会发布。所有这些块都互相呼唤。

请帮忙。

0 个答案:

没有答案