Imports System.Runtime.InteropServices
Imports System.Net.Sockets
Imports System.Net
Imports System.Threading
Module modNetwork
Private output As NetworkStream
Private writer As System.IO.BinaryWriter
Private reader As System.IO.BinaryReader
Private readThread As System.Threading.Thread
Private message As String = ""
Private Connected As Boolean = True
Private FileList As String
Private FolderList As String
Public FinishedNetworkTask As Boolean = False
Public Sub SendFiles(ByVal tmpFileList As String, ByVal tmpFolderList As String)
FileList = tmpFileList
FolderList = tmpFolderList
readThread = New Thread(New ThreadStart(AddressOf RunClient))
readThread.IsBackground = True
readThread.Start()
End Sub
Private Sub RunClient()
Dim client As TcpClient
Try
client = New TcpClient()
client.Connect(IPAddress, Port)
output = client.GetStream()
writer = New System.IO.BinaryWriter(output)
reader = New System.IO.BinaryReader(output)
Do
Try
If FinishedNetworkTask = True Then client.Close()
message = reader.ReadString()
DisplayMessage(message)
Catch ex As Exception
MsgBox(ex.Message)
FinishedNetworkTask = True
End Try
Loop While client.Connected = True
writer.Close()
reader.Close()
output.Close()
client.Close()
Connected = False
Catch ex As Exception
ErrLog(ex.ToString)
FinishedNetworkTask = True
End Try
End Sub
Private Delegate Sub DisplayDelegate(ByVal message As String)
Private Sub DisplayMessage(ByVal message As String)
Dim final_message = "", type As String
' if modifying lstData is not thread safe
If frmMain.InvokeRequired = True Then
' use inherited method Invoke to execute DisplayMessage via a Delegate
frmMain.Invoke(New DisplayDelegate(AddressOf DisplayMessage), New Object() {message})
' OK to modify lstData in current thread
Else
type = Mid(message, 1, 4)
message = Mid(message, 5, message.Length - 4)
Select Case type
Case "CON$"
final_message = message
frmMain.GroupBox2.Text = "Information - Sending File List"
Dim strHostName, strIpAddress As String
Dim transfer As New FileTransferSend(FileList)
AddHandler transfer.TransferFinished, AddressOf TransferFinishedHandler
AddHandler transfer.TransferFailed, AddressOf TransferFailedHandler
AddHandler transfer.TransferProgressChanged, AddressOf TransferProgressChangedHandler
strHostName = System.Net.Dns.GetHostName()
strIpAddress = System.Net.Dns.GetHostEntry(strHostName).AddressList(0).ToString()
frmMain.pbOver.Maximum = GetFileSize(FileList)
Send_Message(strIpAddress & "," & transfer.GetPortNumber & "," & FileList & "," & GetFileSize(FileList), "TFI$")
Case "PRO$"
frmMain.pbOver.Maximum = message.Substring(InStr(message, ":"), message.Length - InStr(message, ":"))
frmMain.pbOver.Value = message.Substring(0, InStr(message, ":") - 1)
Case "FIN$"
FinishedNetworkTask = True
End Select
End If
End Sub
Private Function Send_Message(ByVal Message As String, Optional ByVal Type As String = "") As Integer
'If Connected = True Then
writer.Write(Type & Message)
'Else
'MsgBox("Not Connected Yet")
'End If
End Function
Private Sub TransferFinishedHandler(ByVal sender As FileTransferSend, ByVal file As String)
If InStr(file.ToLower, "file") <> 0 Then
frmMain.GroupBox2.Text = "Information - Sending Folder List"
Dim strHostName, strIpAddress As String
Dim transfer As New FileTransferSend(FolderList)
AddHandler transfer.TransferFinished, AddressOf TransferFinishedHandler
AddHandler transfer.TransferFailed, AddressOf TransferFailedHandler
AddHandler transfer.TransferProgressChanged, AddressOf TransferProgressChangedHandler
strHostName = System.Net.Dns.GetHostName()
strIpAddress = System.Net.Dns.GetHostEntry(strHostName).AddressList(0).ToString()
frmMain.pbOver.Maximum = GetFileSize(FolderList)
Send_Message(strIpAddress & "," & transfer.GetPortNumber & "," & FolderList & "," & GetFileSize(FolderList), "TFO$")
Else
Send_Message(MessageOnComplete, "FIN$")
End If
End Sub
Private Sub TransferFailedHandler(ByVal sender As FileTransferSend, ByVal file As String)
MsgBox("Oops...Something didnt work right.")
End Sub
Private Sub TransferProgressChangedHandler(ByVal sender As FileTransferSend, ByVal current As Long, ByVal maximum As Long)
DisplayMessage("PRO$" & current & ":" & maximum)
End Sub
Public Function GetFileSize(ByVal MyFilePath As String) As Long
Dim MyFile As New System.IO.FileInfo(MyFilePath)
Dim FileSize As Long = MyFile.Length
Return FileSize
End Function
End Module
Public Class FileTransferSend
Private m_listener As System.Net.Sockets.Socket
Private m_Thread As System.Threading.Thread
Private m_file As String
Private m_port As Integer
Private Const BUFFER_SIZE As Integer = 8192
Public Event TransferFinished(ByVal sender As FileTransferSend, ByVal file As String)
Public Event TransferFailed(ByVal sender As FileTransferSend, ByVal file As String)
Public Event TransferProgressChanged(ByVal sender As FileTransferSend, ByVal current As Long, ByVal maximum As Long)
Sub New(ByVal file As String)
m_file = file
m_listener = New System.Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
m_listener.Bind(New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0))
m_listener.Listen(1)
m_Thread = New System.Threading.Thread(AddressOf doListen)
m_Thread.IsBackground = True
m_Thread.Start()
m_port = DirectCast(m_listener.LocalEndPoint, System.Net.IPEndPoint).Port
End Sub
Private Sub doListen()
Dim host As System.Net.Sockets.Socket
Dim bytesRead As Integer = 0
Dim totalBytesRead As Long = 0
Dim sendBuffer(BUFFER_SIZE - 1) As Byte
Dim failed As Boolean = False
Dim fileLength As Long
Dim fStream As System.IO.FileStream = Nothing
'#### Seems to Crash Here
host = m_listener.Accept()
If System.IO.File.Exists(m_file) Then
Try
fStream = New System.IO.FileStream(m_file, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
fileLength = fStream.Length
Do
bytesRead = fStream.Read(sendBuffer, 0, BUFFER_SIZE)
If (bytesRead > 0) Then
host.Send(sendBuffer, bytesRead, Net.Sockets.SocketFlags.None)
totalBytesRead += bytesRead
RaiseEvent TransferProgressChanged(Me, totalBytesRead, fileLength)
End If
Loop While bytesRead > 0
Catch ex As Exception
failed = True
Finally
If Not fStream Is Nothing Then
fStream.Close()
End If
End Try
Else
failed = True
End If
If failed Then
RaiseEvent TransferFailed(Me, m_file)
Else
RaiseEvent TransferFinished(Me, m_file)
End If
End Sub
Public ReadOnly Property GetPortNumber() As Integer
Get
Return m_port
End Get
End Property
End Class