Re: Can someone help me



Thx first,
the code is base on the book but i change a little bit, the example from


the book is only support text file, but i want to also support binary file.
actually, i am new to c#, and i haven't many programming experience

One thing which concerns me is that your OnReadComplete assumes that
whenever you've successfully read a piece of data, that it must contain
a complete filename. What happens if a long filename is sent which is
split over multiple packets, for instance

How can i handle this problem? I am sorry about my English is not very good,and Tnank again



the origianl code is below

using System;
using System.Net.Sockets;
using System.Text;
using System.IO;
// get a file name from the client
// open the file and send the
// contents from the server to the client
public class AsynchNetworkFileServer
{
	class ClientHandler
	{
		// constructor
		public ClientHandler(
			Socket socketForClient )
		{
			// initialize member variable
			socket = socketForClient;
			// initialize buffer to hold
			// contents of file
			
				buffer = new byte[256];
			// create the network stream
			networkStream =
				new NetworkStream(socketForClient);
			// set the file callback for reading
			// the file
			myFileCallBack =
				new AsyncCallback(this.OnFileCompletedRead);
			// set the callback for reading from the
			// network stream
			callbackRead =
				new AsyncCallback(this.OnReadComplete);
			// set the callback for writing to the
			// network stream
			callbackWrite =
				new AsyncCallback(this.OnWriteComplete);
		}
		// begin reading the string from the client
		public void StartRead( )
		{
			// read from the network
			// get a filename
			networkStream.BeginRead(
				buffer, 0, buffer.Length,
				callbackRead, null);
		}
		// when called back by the read, display the string
		// and echo it back to the client
		private void OnReadComplete( IAsyncResult ar )
		{
			int bytesRead = networkStream.EndRead(ar);
			// if you got a string
			if( bytesRead > 0 )
			{
				// turn the string to a file name
				string fileName =
					System.Text.Encoding.ASCII.GetString(
					buffer, 0, bytesRead);
				// update the console
				Console.Write(
					"Opening file {0}", fileName);
				// open the file input stream
				inputStream =
					File.OpenRead(fileName);
				// begin reading the file
				inputStream.BeginRead(
					buffer, // holds the results
					0, // offset
					buffer.Length, // BufferSize
					myFileCallBack, // call back delegate
					null); // local state object
			
					}
			else
			{
				Console.WriteLine( "Read connection dropped");
				networkStream.Close( );
				socket.Close( );
				networkStream = null;
				socket = null;
			}
		}
		// when you have a buffer-full of the file
		void OnFileCompletedRead(IAsyncResult asyncResult)
		{
			int bytesRead =
				inputStream.EndRead(asyncResult);
			// if you read some file
			if (bytesRead > 0)
			{
				// write it out to the client
				networkStream.BeginWrite(
					buffer, 0, bytesRead, callbackWrite, null);
			}
		}
		// after writing the string, get more of the file
		private void OnWriteComplete( IAsyncResult ar )
		{
			networkStream.EndWrite(ar);
			Console.WriteLine( "Write complete");
			// begin reading more of the file
			inputStream.BeginRead(
				buffer, // holds the results
				0, // offset
				buffer.Length, // (BufferSize)
				myFileCallBack, // call back delegate
				null); // local state object
		}
		private const int BufferSize = 256;
		private byte[] buffer;
		private Socket socket;
		private NetworkStream networkStream;
		private Stream inputStream;
		private AsyncCallback callbackRead;
		private AsyncCallback callbackWrite;
		private AsyncCallback myFileCallBack;
	}
	public static void Main( )
	{
		AsynchNetworkFileServer app =
			new AsynchNetworkFileServer( );
		
			app.Run( );
	}
	private void Run( )
	{
		// create a new TcpListener and start it up
		// listening on port 65000
		TcpListener tcpListener = new TcpListener(65000);
		tcpListener.Start( );
		// keep listening until you send the file
		for (;;)
		{
			// if a client connects, accept the connection
			// and return a new socket named socketForClient
			// while tcpListener keeps listening
			Socket socketForClient =
				tcpListener.AcceptSocket( );
			if (socketForClient.Connected)
			{
				Console.WriteLine("Client connected");
				ClientHandler handler =
					new ClientHandler(socketForClient);
				handler.StartRead( );
			}
		}
	}
}
.



Relevant Pages

  • Re: Question on Socket disconnect handling
    ... static void SendCallback ... // simulate timing that can cause callback ... SafeSocket socket = new SafeSocket( ... private class SendCallBackArgs ...
    (microsoft.public.dotnet.languages.csharp)
  • Can someone help me
    ... // get a file name from the client ... // contents from the server to the client public class AsynchNetworkFileServer {class ClientHandler {// constructor public ClientHandler(Socket socketForClient) {// initialize member variable socket = socketForClient; // initialize buffer to hold ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Problem with Socket.EndReceive Returning Invalid Value
    ... flags to SocketFlags.Partial to allow my callback to be invoked as ... soon as it arrives rather than waiting for the receive buffer to fill ... and should be entirely irrelevant for a TCP socket. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: mail mit VB abrufen
    ... Private Enum ePOP3State ... Private buffer As String ... If Err.Number = 0 Then ... Select Case state 'incoming state, ...
    (microsoft.public.de.vb)
  • Re: Applet Hangs when submitting data to servlet
    ... to put a time limit on my socket connections and socket reads. ... public void setTimeoutthrows UnknownHostException, ... on our web server. ... private JButton theSubmitButton_, theClearButton_; ...
    (comp.lang.java.programmer)