Gå til innhold

Noen .NET konger her? NetworkStream problem


Anbefalte innlegg

Hei, jeg lurer på om det er noen her som hadde giddet å skrive en liten kode som logger inn på en server med TcpConnection (Samma hvilken server men la oss si telnet for eksempelets sin skyld)

 

Det programmet skal gjøre er å logge inn på telnet serveren og printe ut det som kommer opp når man logger inn..

 

Denne koden under fungerer greit men den fungerer bare første gang jeg trykker på knappen (visst jeg legger den under en knapp event)

 

Første gang jeg trykker så printer den ut alt som serveren (192.168.1.1) sender tilbake, men neste gang jeg trykker så printer den kun den første linjen :(

Det er ikke serveren det er noe i veien med, jeg har prøvd andre servere og andre service.

 

Bytes[] bytes = new Bytes[1024]

TcpClient() client = new TcpClient();

client.Connect(192.168.1.1,1200);

NetworkStream ns = client.GetStream();

bytesRead = ns.Read(bytes, 0, bytes.Length);

client.close();

ns.close();

Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead));

Lenke til kommentar
Videoannonse
Annonse

Har holdt på med dette i VisualDesigner programmet mitt.

Dette er et program som er til å designe programmeringsprosjekter, og det er laget som en server-klient program, som bruke TcpListener og Socket

 

Det jeg ahr gjort er at jeg har laget et interface INetworkPackage som ser slik ut:

public interface INetworkPackage
{
 void StreamRead(System.IO.BinaryReader br);
 void StreamWrite(System.IO.BinaryWriter bw);
}
public class NetworkPackage : INetworkPackage
{
 public virtual void StreamRead(System.IO.BinaryReader br)
 {
 }
 public virtual void StreamWrite(System.IO.BinaryWriter bw)
 {
 }
}

 

Deretter har jeg laget en NetworkTransaction klasse, som består av en Socket (denne skal kople seg mot serveren)

 

(Constructoren)

 public InformationTransaction(System.Net.IPAddress remote)
 {
 	m_socket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
 	System.Net.IPEndPoint p;
 	p = new System.Net.IPEndPoint(remote, 760);
 	m_socket.Connect(p);
 	m_reader_thread = new System.Threading.Thread(new System.Threading.ThreadStart(this.ReadNetworkData));
 	end_thread = false;
 	m_reader_thread.Priority = System.Threading.ThreadPriority.BelowNormal;
 	m_reader_thread.Start();
 	
 }

 

m_reader_thread er en thread som tar imot data fra serveren, og behandler dem.

Reader funksjonen er så stor, at det ikke er noen hensikt å poste den her, så jeg går over på serveren

 

Serveren har en Collection fyllt med Socket (det er litt mer en det, jeg har laget en Client klasse)

Men når TcpListener får tak i en Connection, legger den de til i m_socket_collection, og evt. starter en thread for hver enkelt, jeg har ingen threads, men jeg lurer på om jeg ikke burde hatt det.

 

private void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 {
 	if(m_listener.Pending())
 	{
   System.Net.Sockets.Socket socket;
   while((socket = m_listener.AcceptSocket()) != null)
   {
   	Client new_client = new Client();
   	new_client.Socket = socket;
   	//m_socket_list.Add(socket);
   	socket.SetSocketOption(System.Net.Sockets.SocketOptionLevel.Socket, System.Net.Sockets.SocketOptionName.ReceiveTimeout, ((int)10000));
   	System.Windows.Forms.ListViewItem item = new_client.UserListItem;

   	SendPackage(socket, new NetworkPackage(), MessageHeader.WhoAreYou);
   	frmMain.MainForm.WriteMessage(new OutputItem(SystemIcons.Information, "Accepted connection from " + socket.RemoteEndPoint.ToString())); 
   	item.Text = "waiting for response...";
   	item.SubItems.Add(socket.RemoteEndPoint.ToString());
   	item.SubItems.Add(System.DateTime.Now.ToShortDateString());
   	item.SubItems.Add("(None)");
   	item.SubItems.Add("(None)");
   	lstCon.Items.Add(item);
   	m_client_list.Add(new_client);
   }
 	}
 }

 

Når klientmaskinen mottar en WhoAreYou pakke, åpner den et Login vindu, som ber om brukernavn og passord, taster du inn riktig brukernavn og passord, sender den et YouKnowMePackage objekt (YouKnowMePackage arver NetworkPackage) som inneholder brukernavn, samt et passord hash.

 

Dette var vel kanskje litt mer avansert en du hadde tenkt deg at ditt program skulle være? men desverre har ikke jeg vært borti TcpClient...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...