title: File transfer using sockets (C#) - received file doesn't contain full data
body: <p>I created a server and a client for a file transfer using socket connection.
  The problem I'm facing is that the received file, if its size is over 8KB, is incomplete.</p>
  
  <p>If you faced this issue, can you guide me onto finding out what I'm doing wrong (on the server  /client side)?</p>
  
  <p>Here are both methods:</p>
  
  <p><strong>Client:</strong></p>
  
  <pre><code>#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("/") &gt; -1)
              {
                  filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
                  fileName = fileName.Substring(fileName.IndexOf("/") + 1);
              }
  
  
              byte[] fileNameByte = Encoding.UTF8.GetBytes(fileName);
              if (fileNameByte.Length &gt; 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
  </code></pre>
  
  <p>and <strong>Server:</strong></p>
  
  <pre><code>#region FILE TRANSFER USING C#.NET SOCKET - SERVER
  
  class FTServer
  {
      IPEndPoint ipEnd_server;
      Socket sock_server;
      public FTServer()
      {
          //make IP end point to accept any IP address with port 5656
          //these values will be altered depending on ******* (and/or other ImportSystem)
          //this was initially coded, but threw a SocketException on sock.Bind(ipEnd) {Only one usage of each socket address (protocol/network addres/port) is normally permitted}
          //ipEnd = new IPEndPoint(IPAddress.Any, 5656);
          //
          //I'll set it like this (giving the IP through a string)
          string IpAddressString = "192.168.1.102";
          ipEnd_server = new IPEndPoint(IPAddress.Parse(IpAddressString), 5656);
          //
          //creating new socket object with protocol type and transfer data type
          sock_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
          //bind end point with newly created socket
          sock_server.Bind(ipEnd_server);
      }
      public static string receivedPath = @"C:\Users\Adrian.Constantin\Desktop\Simulare_Forder_Import\";
      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();
  
              byte[] clientData = new byte[512000];
  
              int receivedBytesLen = clientSock.Receive(clientData, SocketFlags.None);
              clientSock.ReceiveBufferSize = 8192;
  
              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.OpenOrCreate)); ;
              bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
  
              curMsg_server = "Saving file...";
              bWrite.Close();
  
              clientSock.Close();
              curMsg_server = "Received and Archived file [" + fileName + "]; Server stopped.";
  
          }
          catch (SocketException ex)
          {
              curMsg_server = "File Receving error.";
              MessageBox.Show(String.Format("{0} Error cide: {1}", ex.Message, ex.ErrorCode));
          }
      }
  
  
  }
  
  #endregion
  </code></pre>
  
  <p>edit: 24.08.2012 (I've managed to find out the issue and to get the server to work)
  Full code for server is :
  <strong>SERVER:</strong></p>
  
  <pre><code>#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 &gt; 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
  </code></pre>