[VB.NET] [Sockets] Crash de mon serveur
Résolu
Orci76
Messages postés
102
Statut
Membre
-
Orci76 Messages postés 102 Statut Membre -
Orci76 Messages postés 102 Statut Membre -
Bonjour,
Comme plus ou moins indiqué dans le titre de mon post, mon problème vient des sockets.
Lorsque mon serveur (multithreads) est en mode console, il peut sans problème accueillir pleins de clients (j'ai essayé jusqu'à 25, en local), cependant, lorsque pour des raisons pratiques j'ai voulu transposé mon serveur en WinForm, j'ai été confronté à un problème: il pouvait en effet toujours accueillir plusieurs client, cependant, seuls deux maximums peuvent se connecter en même temps.
Si j'en connecte, c'est bon, si j'en connecte un troisième, le premier s'éteint, un quatrième, le deuxième s'éteint et parfois même deux d'un coup.
J'ai eu beau faire plusieurs essaies désespérés, je ne vois pas d'où cela peut venir. Je vais donc vous mettre mon code source quasi complet ci-dessous (les parties utiles à mes yeux):
Pour une question de facilités de lecture, voici un lien PasteBin: https://pastebin.com/xn6SrRQW
Merci d'avance et désolé du dérangement.
Comme plus ou moins indiqué dans le titre de mon post, mon problème vient des sockets.
Lorsque mon serveur (multithreads) est en mode console, il peut sans problème accueillir pleins de clients (j'ai essayé jusqu'à 25, en local), cependant, lorsque pour des raisons pratiques j'ai voulu transposé mon serveur en WinForm, j'ai été confronté à un problème: il pouvait en effet toujours accueillir plusieurs client, cependant, seuls deux maximums peuvent se connecter en même temps.
Si j'en connecte, c'est bon, si j'en connecte un troisième, le premier s'éteint, un quatrième, le deuxième s'éteint et parfois même deux d'un coup.
J'ai eu beau faire plusieurs essaies désespérés, je ne vois pas d'où cela peut venir. Je vais donc vous mettre mon code source quasi complet ci-dessous (les parties utiles à mes yeux):
Imports System.IO Imports System.Net Imports System.Text Imports System.Net.Sockets Imports System.Threading Public Class Form1 Delegate Sub SetTextCallback(ByVal text As String) Private Sub Message(ByVal text As String) If TextBox1.InvokeRequired Then Dim d As New SetTextCallback(AddressOf Message) Invoke(d, New Object() {text}) Else Me.TextBox1.Text &= vbCrLf & text End If End Sub Delegate Sub SetListViewCallback(ByVal p1 As String, ByVal p2 As String) Private Sub ListView(ByVal p1 As String, ByVal p2 As String) Dim SubItemList As ListViewItem = New ListViewItem(New String() {p1, p2}) If ListView1.InvokeRequired Then Dim d As New SetListViewCallback(AddressOf ListView) Invoke(d, New Object() {p1, p2}) Else ListView1.Items.Add(SubItemList) End If End Sub Private Sub waitForClient() Dim serverSocket As New TcpListener(IPAddress.Parse("127.0.0.1"), 8888) Dim clientSocket As TcpClient Dim counter As Integer serverSocket.Start() counter = 0 While (True) counter += 1 clientSocket = serverSocket.AcceptTcpClient() Message("Client N°" + Convert.ToString(counter) + " -- Connected!") startClient(clientSocket, Convert.ToString(counter)) End While clientSocket.Close() serverSocket.Stop() End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim mainThread As Threading.Thread = New Threading.Thread(AddressOf waitForClient) mainThread.Start() End Sub ' =================================================================================== Dim Command As String = "[NONE]" Dim Destinataire As Integer = 0 Dim clientSocket As TcpClient Dim clientNumber As String Public Sub startClient(ByVal inClientSocket As TcpClient, ByVal clientNumberF As String) clientSocket = inClientSocket clientNumber = clientNumberF Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat) ctThread.Start() End Sub Private Sub doChat() Dim bytesFrom(10024) As Byte Dim dataFromClient As String Dim sendBytes As [Byte]() Dim serverResponse As String While 1 Try Dim networkStream As NetworkStream = clientSocket.GetStream() networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize)) dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom) dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")) If dataFromClient.Contains("header") Then Dim strArr() As String strArr = dataFromClient.Split("|") ListView(strArr(1), strArr(2)) End If If Destinataire = clientNumber Or Destinataire = 0 Then serverResponse = Command Command = "[NONE]" Destinataire = 0 Else serverResponse = "[NONE]" End If sendBytes = Encoding.ASCII.GetBytes(serverResponse) networkStream.Write(sendBytes, 0, sendBytes.Length) networkStream.Flush() If Not serverResponse.Contains("[NONE]") Then Message("To Client N°" & clientNumber & ": " & serverResponse) End If Thread.Sleep(500) Catch ex As Exception MsgBox(ex.ToString) End Try End While End Sub End Class
Pour une question de facilités de lecture, voici un lien PasteBin: https://pastebin.com/xn6SrRQW
Merci d'avance et désolé du dérangement.
A voir également:
- [VB.NET] [Sockets] Crash de mon serveur
- Changer serveur dns - Guide
- Serveur de reception mail - Guide
- Serveur dns gratuit - Guide
- Rapport de crash windows - Guide
- Serveur dns orange - Accueil - Guide box et connexion Internet
2 réponses
Up? Si je n'ai pas été assez précis sur un point (je ne vois pas où, mais je connais le problème, dur d'être impartial :x), n'hésitez pas à me demander x)
Désolé du triple post, c'est seulement pour dire que je résolu mon problème par moi-même ; comment? je ne sais pas vraiment à vrai dire...
J'avais un problème avec la ligne suivante:
Je me suis ensuite aperçu en le testant que "IDList.Length" changeait seulement la première fois ( "+1" je suppose) et ensuite gardait sa valeur.
J'en ai donc déduit que c'était limite pour un seul coup (bizarre je trouve d'ailleurs, la valeur n'a pas l'air d'être modifié.
J'ai donc ensuite mis ceci:
clientNumber contenant le numéro du client en cours sur le thread (de 1 à X), cela fonctionne maintenant "parfaitement".
PS: Je me suis ensuite renseigné, et d'après ce que j'ai pu voir sur un site, le code suivant permettrait de connaître la dimension d'un tableau dynamique:
Qu'en pensez vous? laquelle des deux méthodes est la plus rentable? (j'aurais parié pour la mienne, étant donné que je crée ni variable, ni fonction en plus mais que j'arrive tout de même au résultat souhaite).
Merci d'avoir, en espérant que cette histoire de tableau dynamique puisse aider quelqu'un d'autre.
J'avais un problème avec la ligne suivante:
ReDim Preserve IDList(IDList.Length + 1)
Je me suis ensuite aperçu en le testant que "IDList.Length" changeait seulement la première fois ( "+1" je suppose) et ensuite gardait sa valeur.
J'en ai donc déduit que c'était limite pour un seul coup (bizarre je trouve d'ailleurs, la valeur n'a pas l'air d'être modifié.
J'ai donc ensuite mis ceci:
ReDim Preserve IDList(IDList.Length + clientNumber)
clientNumber contenant le numéro du client en cours sur le thread (de 1 à X), cela fonctionne maintenant "parfaitement".
PS: Je me suis ensuite renseigné, et d'après ce que j'ai pu voir sur un site, le code suivant permettrait de connaître la dimension d'un tableau dynamique:
Private Function GetUpper(varArray As Variant) As Integer Dim Upper As Integer On Error Resume Next Upper = UBound(varArray) If Err.Number Then If Err.Number = 9 Then Upper = 0 Else With Err MsgBox "Error:" & .Number & "-" & .Description End With Exit Function End If Else Upper = UBound(varArray) + 1 End If On Error GoTo 0 GetUpper = Upper End Function
Qu'en pensez vous? laquelle des deux méthodes est la plus rentable? (j'aurais parié pour la mienne, étant donné que je crée ni variable, ni fonction en plus mais que j'arrive tout de même au résultat souhaite).
Merci d'avoir, en espérant que cette histoire de tableau dynamique puisse aider quelqu'un d'autre.