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.
If you faced this issue, can you guide me onto finding out what I'm doing wrong (on the server /client side)?
Here are both methods:
Client:
#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
and Server:
#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
edit: 24.08.2012 (I've managed to find out the issue and to get the server to work) Full code for server is : SERVER:
#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