Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: flashnet en 16 Marzo 2010, 01:10 am



Título: sockets
Publicado por: flashnet en 16 Marzo 2010, 01:10 am
Hola buenas, tengo un pequeño problema.
Quiero hacer un cliente al cual conecte a distintos servers simultaneamente y el comando que envie se envie a todos.
Hasta hay bien, el problema esta en que no consigo hacer varias conexiones a la ver solo una.
A ver si me podeis ayudar.

Gracias de antemano

aqui el codigo

Código:

Imports System.IO
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading


Public Class Form1

    Private oTCPStream As Net.Sockets.NetworkStream
    Public Shared oTCP As New Net.Sockets.TcpClient()
    Private bytWriting As [Byte]()
    Private bytReading As Byte()

    Private oHebras As Thread


    Public Delegate Sub ParameterizedThreadStart(ByVal obj As String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        txtNameFile.ReadOnly = True
        OpenFileDialog1.Filter = "File Txt |*.txt"
        OpenFileDialog1.Title = "Open File"
        OpenFileDialog1.Multiselect = False

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnArchivo.Click

        ComboBox1.Items.Clear()

        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            txtNameFile.Text = OpenFileDialog1.FileName

        End If
        If Not Trim(txtNameFile.Text) = "" Then
            Dim objReader As New StreamReader(txtNameFile.Text)
            Dim sLine As String = ""

            While sLine IsNot Nothing
                sLine = objReader.ReadLine()
                If sLine IsNot Nothing Then
                    ComboBox1.Items.Add(sLine)
                End If
            End While

            objReader.Close()

        End If

    End Sub

    Private Function ConnServ(ByRef VarIP) As Object

        If Not VarIP = "" Then
            Try
                System.Threading.Thread.Sleep(1500)

                oTCP.SendTimeout = 1500
                oTCP.Connect(Trim(VarIP), "8000")

                oTCPStream = oTCP.GetStream

                WriteData(Trim(txtUser.Text) & vbCrLf)
                System.Threading.Thread.Sleep(500)

                WriteData(Trim(txtPassword.Text) & vbCrLf)
                System.Threading.Thread.Sleep(500)

                WriteData("Hello Serv" & vbCrLf)
                System.Threading.Thread.Sleep(500)

                '  oTCPStream.Close()
                '  oTCP.Close()

            Catch ex As Exception
                MsgBox(ex.Message)

            End Try

        End If

        Return Nothing

    End Function

    Private Sub WriteData(ByVal sData As String)

        bytWriting = System.Text.Encoding.ASCII.GetBytes(sData)

        oTCPStream.Write(bytWriting, 0, bytWriting.Length)

    End Sub


    Private Sub btnConn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConn.Click

        Dim I As Integer
        Dim NewIP As String


        For I = 0 To ComboBox1.Items.Count - 1
            NewIP = (ComboBox1.Items(I).ToString)

            Dim t As New Thread(DirectCast(Function() ConnServ(NewIP), ThreadStart))
            t.Start()


        Next
    End Sub
End Class



Título: Re: sockets
Publicado por: raul338 en 16 Marzo 2010, 13:46 pm
No se puede conectar un socket cliente a varios servidores. Debes hacerte un array de sockets (o tcpClients) que conecten uno a cada servidor. Luego para mandarle los datos. Recorres ese arreglo enviando uno por uno


Título: Re: sockets
Publicado por: [D4N93R] en 16 Marzo 2010, 14:23 pm
Exacto, un socket por conexión, jjejej Raul deja el empeño con los sockets, FlashNet usa TcpClient :P es lo mismo pero más arreglado.. :D

Claro, amenos de que desees controlar mejor la conexión, pero no creo que sea tu caso.

Un saludo!


Título: Re: sockets
Publicado por: raul338 en 16 Marzo 2010, 14:25 pm
Soy socket-Fan! JAJA.... es que desde que aprendi sockets (en vb6) lo uso de esa manera y me parece mas "comoda"


Título: Re: sockets
Publicado por: [D4N93R] en 16 Marzo 2010, 15:02 pm
:P A mi también me gusta hacer las cosas así. xD es mas divertido. mas crudo :D


Título: Re: sockets
Publicado por: flashnet en 16 Marzo 2010, 16:15 pm
Me podias poner un ejemplo simple de conexion multiple con TcpClient?
y como se realizaria con un array?

Muchas gracias a los 2 por la ayuda

Exacto, un socket por conexión, jjejej Raul deja el empeño con los sockets, FlashNet usa TcpClient :P es lo mismo pero más arreglado.. :D

Claro, amenos de que desees controlar mejor la conexión, pero no creo que sea tu caso.

Un saludo!


Título: Re: sockets
Publicado por: [D4N93R] en 16 Marzo 2010, 20:35 pm
Uhm, ahora no estoy en el equipo con VS y no puedo probar :( Alquien me puede ayudar aki , raul! jaja


Título: Re: sockets
Publicado por: raul338 en 16 Marzo 2010, 22:01 pm
acabo de reformatear y tampoco tengo el vs, asi que pondre algo de C# con pseudo codigo JAJA XD

Código
  1. using System.Collections.Generic;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Net;
  5.  
  6. namespace MuestraClienteMultiple{
  7. class program {
  8.  
  9. struct Conexion {
  10.   byte[] buffer;
  11.   TcpClient client;
  12.   string host;
  13. }
  14.  
  15. static int main() {
  16. string[] hosts = { "google.com", "www.raul338.com.ar" }; // direcciones servidor
  17. List<Conexion> conexiones = new List<Conexion>(hosts.Length); // Lista del mismo tamaño de las direcciones
  18.  
  19. foreach (string s in hosts) {
  20.   Conexion conex;
  21.   conex.host = s;
  22.   conex.buffer = new Byte[2048]; // 2 Mb de buffer
  23.   conex.client = new TcpClient(); // Direccion en el puerto 80
  24.   conexiones.Add(conex);
  25.  
  26.   conex.client Connect(s, 80);
  27.   if (conex.client.Connected) {
  28.      StreamReader sr = new StreamReader(conex.client.GetStream());
  29.      Console.WriteLine(sr.ReadToEnd());
  30.   }
  31.   conex.Close();
  32. } // foreach
  33.  
  34. }
  35. }// class program
  36. }// namespace
  37.  

Deberia funcionar, .... es un ejemplo basico inventado al vuelo. Te devuelve las salidas HTML de google y de mi pagina web :P


Título: Re: sockets
Publicado por: flashnet en 16 Marzo 2010, 22:39 pm
Muchisimas gracias a los 2, le voy a echar un vistazo.

Se agradece vuestro interes

:-)


Título: Re: sockets
Publicado por: [D4N93R] en 17 Marzo 2010, 15:31 pm
Excelente, Y eso que esta echo a lo rápido, pero quedo muy bien, voy a modificarlo con tu permiso.

Código
  1. using System.Collections.Generic;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Net;
  5.  
  6. namespace MuestraClienteMultiple{
  7. class program {
  8.  
  9. public class Conexion {
  10.   byte[] buffer;
  11.   TcpClient client;
  12.   string host;
  13.  
  14.   public Conexion(string hostname, int bufferSize){
  15.       host =hostname;
  16.       buffer = new Byte[bufferSize];
  17.   }
  18.  
  19.   public string GetData(){
  20.       string result=String.Empty;
  21.       try{
  22.          client Connect(s, 80);
  23.  
  24.          if (client.Connected) {
  25.              StreamReader sr = new StreamReader(client.GetStream());
  26.              result= sr.ReadToEnd());
  27.          }
  28.       }
  29.       finally{
  30.          conex.Close();
  31.       }
  32.       return result;
  33.   }
  34. }
  35.  
  36. static int main() {
  37. string[] hosts = { "google.com", "www.raul338.com.ar" }; // direcciones servidor
  38. List<Conexion> conexiones = new List<Conexion>(hosts.Length); // Lista del mismo tamaño de las direcciones
  39.  
  40. foreach (string s in hosts) {
  41.   Conexion conex = new Conexion(x, 2048);
  42.   //conex.buffer = new Byte[2048]; // 2 Mb de buffer
  43.   //conex.client = new TcpClient(); // Direccion en el puerto 80
  44.   conexiones.Add(conex);
  45.  
  46.   Console.WriteLine(conex.GetData());
  47.  
  48. } // foreach
  49.  
  50. }
  51. }// class program
  52. }// namespace


Título: Re: sockets
Publicado por: raul338 en 17 Marzo 2010, 16:34 pm
Excelente, Y eso que esta echo a lo rápido, pero quedo muy bien, voy a modificarlo con tu permiso.

Código
  1. using System.Collections.Generic;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Net; // Double Imports xD XD - OWNED
  5.  
  6. namespace MuestraClienteMultiple{
  7. class program {
  8.  
  9. public class Conexion {
  10.   byte[] buffer;
  11.   TcpClient client;
  12.   string host;
  13.  
  14.   public Conexion(string hostname, int bufferSize){
  15.       host =hostname;
  16.       buffer = new Byte[bufferSize];
  17.   }
  18.  
  19.   public string GetData(){
  20.       string result=String.Empty;
  21.       try{
  22.          client.Connect(s, 80); // Falto un punto, punto primordial (?
  23.  
  24.          if (client.Connected) {
  25.              StreamReader sr = new StreamReader(client.GetStream());
  26.              result= sr.ReadToEnd());
  27.          }
  28.       }
  29.       finally{
  30.          conex.Close();
  31.       }
  32.       return result;
  33.   }
  34. }
  35.  
  36. static int main() {
  37. string[] hosts = { "google.com", "www.raul338.com.ar" }; // direcciones servidor
  38. List<Conexion> conexiones = new List<Conexion>(hosts.Length); // Lista del mismo tamaño de las direcciones
  39.  
  40. foreach (string s in hosts) {
  41.   Conexion conex = new Conexion(x, 2048);
  42.   //conex.buffer = new Byte[2048]; // 2 Mb de buffer
  43.   //conex.client = new TcpClient(); // Direccion en el puerto 80
  44.   conexiones.Add(conex);
  45.  
  46.   Console.WriteLine(conex.GetData());
  47.  
  48. } // foreach
  49.  
  50. }
  51. }// class program
  52. }// namespace

Esta bien, salvo por eso, de donde aparece la variable S :xD XD, tiene que ser "host"  ;)



flashnet, tambien deberias a aprender a manejarlos asincronicamente(con delegados) asi no se te tilda la aplicacion mientras pide los datos ;-) (tipico caso de un socket intentando conectar a unhost inexistente, esperar 30 segundos hasta que te diga "no se pudo conectar"  :¬¬)


Título: Re: sockets
Publicado por: [D4N93R] en 17 Marzo 2010, 18:14 pm
Ups  :silbar:

Hey, como hiciste para resaltar esa linea :(


Título: Re: sockets
Publicado por: raul338 en 17 Marzo 2010, 18:21 pm
[ code=(lenguaje),(nº de linea a resaltar) ] :P


Título: Re: sockets
Publicado por: seba123neo en 17 Marzo 2010, 18:22 pm
Ups  :silbar:

Hey, como hiciste para resaltar esa linea :(

en el geshi despues de poner el lenguaje pones la linea que queres resaltar...por ejemplo:

[ code=csharp,2]

eso resalta la linea 2 del codigo...

saludos.

PD: posteamos juntos..


Título: Re: sockets
Publicado por: flashnet en 17 Marzo 2010, 18:24 pm
Gracias nuevamente a los dos, ahora mismo me voy a poner a probar.
El tema de delegates tambien lo mirare y ya os contare mis progresos.

Gracias 


Título: Re: sockets
Publicado por: [D4N93R] en 17 Marzo 2010, 19:17 pm
Gracias a ambos, jeje si, hicieron el post al mismo tiempo :P