Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Shaun E on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Textbook sample code: works once but not twice

Status
Not open for further replies.

JoBlink

Technical User
May 28, 2004
38
US
Hi!
I am having difficult time making a small modification to a textbook sample code.
This code is for two applications: first application sends a file to TCP port and second listens on TCP port and receives it.

First App TCP Send form has two text boxes, named txtHost and txtPort, with values "localhost" and "2112".

Listener has rich text box named txtDisplay.

I added second button to the TCP Send application, copied the code from the first button and change a filename to be sent. It worked.

Now I have first application with two buttons sending two different files.

The problem: after I send one file, I cannot send another. I get an error message saying that the target machine actively refused connection.

Testing revealed that restarting listener application between button pushes works-both files are received, albeit not at once. However restarting sender application has no effect-listener still refuses connection.


Could you pls point out what needs to be modified to receive and display both files?

Thank you

///here is my code sample
/// Socket Listener application
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

using System.Net;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using System.Text;


namespace WinsockListen2
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.RichTextBox txtDisplay;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
Thread thread = new Thread(new ThreadStart(Listen));
thread.Start();
//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.txtDisplay = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(72, 0);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 1;
this.textBox1.Text = "textBox1";
//
// txtDisplay
//
this.txtDisplay.Location = new System.Drawing.Point(0, 24);
this.txtDisplay.Name = "txtDisplay";
this.txtDisplay.Size = new System.Drawing.Size(288, 248);
this.txtDisplay.TabIndex = 3;
this.txtDisplay.Text = "richTextBox1";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.txtDisplay,
this.textBox1});
this.Name = "Form1";
this.Text = "Listen";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

public void Listen()

{
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, protocolType.Tcp);

listener.Bind(new IPEndPoint(IPAddress.Any, 2112));
listener.Listen(0);

Socket socket = listener.Accept();
Stream netStream = new NetworkStream(socket);
StreamReader reader = new StreamReader(netStream);
string result = reader.ReadToEnd();

Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] {result});

socket.Close();
listener.Close();
}

public void UpdateDisplay(string text)
{
txtDisplay.Text = text;
}

protected delegate void UpdateDisplayDelegate(string text);
}


}


///////////////////////TCP SEND APPLICARION////////////////
/////Modify target file paths as you wish for this example//
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace Wrox.ProCSharp.InternetAccess.TcpSend
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtHost;
private System.Windows.Forms.TextBox txtPort;
private System.Windows.Forms.Button button2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.txtHost = new System.Windows.Forms.TextBox();
this.txtPort = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// txtHost
//
this.txtHost.Location = new System.Drawing.Point(8, 32);
this.txtHost.Name = "txtHost";
this.txtHost.Size = new System.Drawing.Size(104, 20);
this.txtHost.TabIndex = 0;
this.txtHost.Text = "localhost";
//
// txtPort
//
this.txtPort.Location = new System.Drawing.Point(136, 32);
this.txtPort.Name = "txtPort";
this.txtPort.Size = new System.Drawing.Size(40, 20);
this.txtPort.TabIndex = 1;
this.txtPort.Text = "2112";
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 64);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(88, 32);
this.button1.TabIndex = 2;
this.button1.Text = "Send File";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.Location = new System.Drawing.Point(136, 8);
this.label1.Name = "label1";
this.label1.TabIndex = 3;
this.label1.Text = "Port";
//
// label2
//
this.label2.Location = new System.Drawing.Point(8, 8);
this.label2.Name = "label2";
this.label2.TabIndex = 4;
this.label2.Text = "Hostname";
//
// button2
//
this.button2.Location = new System.Drawing.Point(112, 72);
this.button2.Name = "button2";
this.button2.TabIndex = 5;
this.button2.Text = "button2";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(200, 109);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.button2,
this.label2,
this.label1,
this.button1,
this.txtPort,
this.txtHost});
this.Name = "Form1";
this.Text = "TcpSend";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{
TcpClient tcpClient = new TcpClient(txtHost.Text, Int32.Parse(txtPort.Text));

NetworkStream ns = tcpClient.GetStream();

//////////// TARGET FILE PATH///////////////////
FileStream fs = File.Open("c:\\..\\boot.ini", FileMode.Open);

int data = fs.ReadByte();
while(data != -1)
{
ns.WriteByte((byte)data);
data = fs.ReadByte();
}

fs.Close();
ns.Close();
tcpClient.Close();

}

private void button2_Click(object sender, System.EventArgs e)
{
TcpClient tcpClient = new TcpClient(txtHost.Text, Int32.Parse(txtPort.Text));

NetworkStream ns = tcpClient.GetStream();

//////////// TARGET FILE PATH///////////////////
FileStream fs = File.Open("..\\..\\form1.cs", FileMode.Open);

int data = fs.ReadByte();
while(data != -1)
{
ns.WriteByte((byte)data);
data = fs.ReadByte();
}

fs.Close();
ns.Close();
tcpClient.Close();
}
}
}
 
I see a couple of problems:
- You aren't closing your streams
- Your update delegate is running in your worker thread (it needs to run in the thread that created the form)

You may also need to investigate calling Dispose on your objects -- my first thought was of a garbage collector problem.

Chip H.


____________________________________________________________________
If you want to get the best response to a question, please read FAQ222-2244 first
 
Thanks Chip!

I think you are onto something with treads: The book was talking about creating a separate thread for a listener application to listen for incoming connections.
The real problem is the listener's inability to receive second transmission.
Can listener recive 2 streams (or maintain 2 connections) simultaneously?

X44
 
No, each listener can only monitor one conversation.

Chip H.


____________________________________________________________________
If you want to get the best response to a question, please read FAQ222-2244 first
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top