Programming/C#2012. 11. 9. 23:59

#region FILE TRANSFER USING C#.NET SOCKET - CLIENT


class FTClient

{

    public static string curMsg_client = "Idle";

    public static void SendFile(string fileName)

    {

        try

        {

            //IPAddress[] ipAddress = Dns.GetHostAddresses("localhost");

            //IPEndPoint ipEnd = new IPEndPoint(ipAddress[0], 5656);


            string IpAddressString = "192.168.1.102";

            IPEndPoint ipEnd_client = new IPEndPoint(IPAddress.Parse(IpAddressString), 5656);

            Socket clientSock_client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);



            string filePath = "";


            fileName = fileName.Replace("\\", "/");

            while (fileName.IndexOf("/") > -1)

            {

                filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);

                fileName = fileName.Substring(fileName.IndexOf("/") + 1);

            }



            byte[] fileNameByte = Encoding.UTF8.GetBytes(fileName);

            if (fileNameByte.Length > 5000 * 1024)

            {

                curMsg_client = "File size is more than 5Mb, please try with small file.";

                return;

            }


            curMsg_client = "Buffering ...";

            string fullPath = filePath + fileName;


            byte[] fileData = File.ReadAllBytes(fullPath);

            byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];

            byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);


            fileNameLen.CopyTo(clientData, 0);

            fileNameByte.CopyTo(clientData, 4);

            fileData.CopyTo(clientData, 4 + fileNameByte.Length);


            curMsg_client = "Connection to server ...";

            clientSock_client.Connect(ipEnd_client);


            curMsg_client = "File sending...";

            clientSock_client.Send(clientData, 0, clientData.Length, 0);


            curMsg_client = "Disconnecting...";

            clientSock_client.Close();

            curMsg_client = "File [" + fullPath + "] transferred.";


        }

        catch (Exception ex)

        {

            if (ex.Message == "No connection could be made because the target machine actively refused it")

                curMsg_client = "File Sending fail. Because server not running.";

            else

                curMsg_client = "File Sending fail." + ex.Message;

        }


    }

}


#endregion



#region FILE TRANSFER USING C#.NET SOCKET - SERVER


class FTServer

{

    IPEndPoint ipEnd_server;

    Socket sock_server;

    public FTServer()

    {

        string IpAddressString = "192.168.1.102";

        ipEnd_server = new IPEndPoint(IPAddress.Parse(IpAddressString), 5656);

        sock_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

        sock_server.Bind(ipEnd_server);

    }

    public static string receivedPath = @"C:\";

    public static string curMsg_server = "Stopped!";



    public void StartServer()

    {

        try

        {

            curMsg_server = "Starting...";


            sock_server.Listen(100);


            curMsg_server = "Running and waiting to receive file.";


            Socket clientSock = sock_server.Accept();

            clientSock.ReceiveBufferSize = 16384;


            byte[] clientData = new byte[1024 * 50000];


            int receivedBytesLen = clientSock.Receive(clientData, clientData.Length, 0);

            curMsg_server = "Receiving data...";


            int fileNameLen = BitConverter.ToInt32(clientData, 0);

            string fileName = Encoding.UTF8.GetString(clientData, 4, fileNameLen);


            BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Append));

            bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);



            while (receivedBytesLen > 0)

            {

                receivedBytesLen = clientSock.Receive(clientData, clientData.Length, 0);

                if (receivedBytesLen == 0)

                {

                    bWrite.Close();

                }

                else

                {

                    bWrite.Write(clientData, 0, receivedBytesLen);

                                        }

            }



            curMsg_server = "Saving file...";

            bWrite.Close();


            clientSock.Close();

            curMsg_server = "Received and Archived file [" + fileName + "] (" + (receivedBytesLen - 4 - fileNameLen) + " bytes received); Server stopped.";


        }

        catch (SocketException ex)

        {

            curMsg_server = "File Receving error.";

            MessageBox.Show(String.Format("{0} Error code: {1}", ex.Message, ex.ErrorCode));

        }

    }


}


#endregion


http://stackoverflow.com/questions/12087145/file-transfer-using-sockets-c-received-file-doesnt-contain-full-data

Posted by Mocker