Я пытаюсь перенаправить выходные данные standard
и error
моего процесса (написанного на VB.NET), где я выполняю непрерывную команду. Это команда tshark (инструмент командной строки Wireshark), который фиксирует сетевой трафик во время выполнения. Я попробовал обе следующие команды:
-i 5 -B 1 -w /sample.pcap --print -Tfields -e frame.number -e ip.addr -e tcp -e _ws.col.Info -E separator=/t
-i 10 -T fields -e dns.qry.name src port 53
Обе команды отлично работают в командной строке. Однако при попытке перенаправить вывод в коде работает только команда номер 1, а вторая команда зависает при выполнении StreamReader.ReadLine
.
Обратите внимание, что я знаю, что ReadLine
ожидает новой строки, которая будет прочитана потоком, где обе приведенные выше команды генерируют новую строку вывода для каждого захваченного пакета. Я также пытался использовать Read
и ReadBlock
(относительно необходимых изменений в коде), но ни одна из них не работала для второй команды.
Вот мой код:
Public Class Form1
Dim output As String
Dim oProcess As New Process()
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Dim oStartInfo As New ProcessStartInfo("C:\Program Files\Wireshark\tshark.exe", "-i 10 -T fields -e dns.qry.name src port 53")
oStartInfo.UseShellExecute = False
oStartInfo.RedirectStandardOutput = True
oStartInfo.RedirectStandardError = True
oStartInfo.CreateNoWindow = True
oStartInfo.WindowStyle = ProcessWindowStyle.Hidden
oProcess.StartInfo = oStartInfo
Catch ex As Exception
MsgBox(ex)
End Try
BackgroundWorker1.RunWorkerAsync()
Button1.Enabled = False
Button2.Enabled = True
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Try
Threading.Thread.Sleep(2000)
If oProcess.Start() Then
Dim sOutput As String
Using oStreamReader As System.IO.StreamReader = oProcess.StandardOutput
sOutput = oStreamReader.ReadLine
While Not sOutput Is Nothing
output = sOutput & vbNewLine
BackgroundWorker1.ReportProgress(10)
sOutput = sOutput + vbNewLine + oStreamReader.ReadLine
End While
End Using
Using oStreamReader As System.IO.StreamReader = oProcess.StandardError
sOutput = oStreamReader.ReadLine
While Not sOutput Is Nothing
output = sOutput & vbNewLine
BackgroundWorker1.ReportProgress(10)
sOutput = sOutput + vbNewLine + oStreamReader.ReadLine
End While
End Using
Else
MsgBox("Error starting the process")
End If
Catch ex As Exception
MsgBox(ex)
End Try
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
TextBox1.Text = output
TextBox1.Select(0, 0)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
BackgroundWorker1.CancelAsync()
Button1.Enabled = True
Button2.Enabled = False
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
End Class
BeginOutputReadLine()
иBeginErrorReadLine()
в сочетании с событиемExited
. Пример кода здесь (вывод идет в RichTextBox. Конечно, вы можете обновить любой другой элемент управления). - person Jimi   schedule 19.05.2019Exited
там, где его не было. Я начал думать, что может быть другой модуль записи вывода, которыйtshark
использует для печати пакетов. что ты думаешь? - person Mohammad Fneish   schedule 19.05.2019"-i 10 -j ""http tcp ip"" -P -V"
. Вы должны увидеть массивный поток информации. - person Jimi   schedule 19.05.2019"-i 10 -T fields -e frame.number -e ip.addr -e udp -e _ws.col.Info -j ""http tcp ip"" -P -V"
. Сузьте его после. Вы должны видеть некоторую информацию время от времени. - person Jimi   schedule 19.05.2019The NPF driver isn't running. You may have trouble capturing or listing interfaces. Capturing on 'Wi-Fi'
- person Mohammad Fneish   schedule 19.05.2019The NPF driver isn't running. You may have trouble capturing or listing interfaces. Capturing on 'Wi-Fi' www.youtube.com www.google.com www.google.com.lb i.ytimg.com fonts.googleapis.com yt3.ggpht.com fonts.gstatic.com s.ytimg.com s3.amazonaws.com 1.1.168.198.in-addr.arpa 19.1.168.192.in-addr.arpa 1.1.168.198.in-addr.arpa 19.1.168.192.in-addr.arpa 13 packets captured
- person Mohammad Fneish   schedule 19.05.2019net start npf
) и посмотрите, что произойдет. Запустите процесс с повышенными правами. - person Jimi   schedule 19.05.2019-i 10 -w ./sample.pcap -P -V --print -Tfields -e dns.qry.name src port 53
, и это после прочтения документов tshark, в которых говоритсяIf you want the packets to be displayed to the standard output and also saved to a file, specify the -P option in addition to the -w option to have the summary line displayed
, теперь он печатает 4 пакета, а затем возникает событиеprocess exited
- person Mohammad Fneish   schedule 19.05.2019