Imports System.IO
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text
Module Module1
<MTAThread()>
Sub Main()
Dim maxthreads As Integer = 10
ThreadPool.SetMaxThreads(maxthreads, maxthreads)
Dim serverlist() As String = File.ReadAllLines("final.txt")
Dim servernum As New CountdownEvent(serverlist.GetUpperBound(0) + 1)
For Each a In serverlist
Dim args(1) As Object
args(0) = a
args(1) = servernum
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ping), args)
Next
servernum.Wait()
Console.ReadLine()
End Sub
Public Sub ping(ByVal server() As Object)
Dim serverinfo() As String = Split(server(0), ",")
Dim socketclient As New TcpClient
Console.WriteLine(serverinfo(0))
Try
socketclient.Connect(serverinfo(0), serverinfo(1))
Catch ex As Exception
If socketclient.Connected = False Then
Throw New Exception("Server Offline")
Else
Throw New Exception("Unknown Error Occured")
End If
End Try
Dim stream As NetworkStream = socketclient.GetStream
stream.ReadTimeout = 1000
stream.WriteTimeout = 1000
Dim sendBytes As [Byte]() = {&HFE}
stream.Write(sendBytes, 0, sendBytes.Length)
Dim bytes(421) As Byte
stream.Read(bytes, 0, CInt(421))
socketclient.Close()
Dim trimbytes(bytes.Length - 3) As Byte
Array.Copy(bytes, 3, trimbytes, 0, bytes.Length - 3)
Dim returndata As String = Encoding.BigEndianUnicode.GetString(trimbytes)
Dim sb As New System.Text.StringBuilder
For i As Integer = 1 To 241 Step 2
If trimbytes(i) <> 0 Then
sb.Append(ChrW(BitConverter.ToInt16(trimbytes, i)))
End If
Next i
Dim message() As String = sb.ToString.Split("§")
'Write processed server information to the console
Console.WriteLine("Received -->" & message(1) & " " & message(2) & " | " & serverinfo(0))
server(1).signal()
End Sub
End Module
上記は私のコードです。基本的にやりたいことは、テキスト ファイルから 2 つ (またはそれ以上) の IP を取得し、2 つの異なるスレッドで TCP 経由でそれらの両方に接続し、サーバーから応答を取得することです。
さて、ここでの問題は次のとおりです。何らかの理由で、2 つのサーバーのうちの 1 つが応答を受け取りますが、もう 1 つのサーバーは応答しません。両方のサーバーがオンラインで、接続を受け入れていることを確認しました。また、両方のスレッドで同じ IP が使用されるように、テキスト ファイルの両方の行に同じサーバーを配置しようとしましたが、これも機能しません。2 つの IP が同じ場合でも、一方は応答を受け取りますが、もう一方は応答しません。これは、私がひどく間違ったことをしていることを意味するに違いありません。
1つ以上ではなく1つのサーバーを使用すると、すべてが完全に機能し、探している応答が得られます。1つ以上のもので、実行される最初のスレッドが応答を生成するように見えますが、後で実行されるものは何も生成されません。どんな助けでも大歓迎です。
私も Paarallel.For を使用してみましたが、同じ問題に遭遇しました。
Parallel.ForEach(serverlist, _
Sub(currentElement)
ping(currentElement)
End Sub)