1- I have a GHIElectronics FEZ Spider 3 device
2- I have connected the device to my laptop via an Ethernet cable and configured the network settings
3- I can ping the FEZ device from my laptop using cmd : ping 172.16.43.193
4- I have wriiten a windows forms application to run on my laptop and act as a TCP Receiver
5- I want to send TCP Packets from FEZ device to the win app on my laptop
the following is the win app code :
string[] dnsAddresses = { "172.16.40.2", "172.16.40.5" };
const Int32 c_port = 12250;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
System.Threading.Thread t = new Thread(new ThreadStart(SendTCPMessage));
txtStatus.Text = txtStatus.Text + "TCP listening established successfully\r\n";
}
catch (Exception ex)
{
txtStatus.Text = txtStatus.Text + "An error occured while trying to establish TCP listening : \r\n" + ex.Message + "\r\n";
if (ex.InnerException != null)
txtStatus.Text = txtStatus.Text + ex.InnerException + "\r\n";
}
}
private void SendTCPMessage()
{
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, c_port);
server.Bind(localEndPoint);
server.Listen(1);
while (true)
{
// Wait for a client to connect.
Socket clientSocket = server.Accept();
// Process the client request. true means asynchronous.
new ProcessClientRequest(clientSocket, true);
}
}
internal sealed class ProcessClientRequest
{
private Socket m_clientSocket;
/// <summary>
/// The constructor calls another method to handle the request, but can
/// optionally do so in a new thread.
/// </summary>
/// /// <param name="clientSocket"></param>
/// <param name="asynchronously"></param>
public ProcessClientRequest(Socket clientSocket, Boolean asynchronously)
{
m_clientSocket = clientSocket;
if (asynchronously)
// Spawn a new thread to handle the request.
new Thread(ProcessRequest).Start();
else ProcessRequest();
}
/// <summary>
/// Processes the request.
/// </summary>
private void ProcessRequest()
{
const Int32 c_microsecondsPerSecond = 1000000;
// 'using' ensures that the client's socket gets closed.
using (m_clientSocket)
{
// Wait for the client request to start to arrive.
Byte[] buffer = new Byte[1024];
if (m_clientSocket.Poll(5 * c_microsecondsPerSecond,
SelectMode.SelectRead))
{
// If 0 bytes in buffer, then the connection has been closed,
// reset, or terminated.
if (m_clientSocket.Available == 0)
return;
// Read the first chunk of the request (we don't actually do
// anything with it).
Int32 bytesRead = m_clientSocket.Receive(buffer,
m_clientSocket.Available, SocketFlags.None);
String result = "";
string FileContent = new string(Encoding.UTF8.GetChars(buffer));
MessageBox.Show("Text file with following content received :\r\n" + FileContent);
if (SaveFile(FileContent))
{
result = "1";
}
else
{
result = "0";
}
// Return a static string to the client.
byte[] buf = Encoding.UTF8.GetBytes(result);
int offset = 0;
int ret = 0;
int len = buf.Length;
while (len > 0)
{
ret = m_clientSocket.Send(buf, offset, len, SocketFlags.None);
len -= ret;
offset += ret;
}
m_clientSocket.Close();
}
}
}
private bool SaveFile(string FileContent)
{
bool returnValue = false;
try
{
string RootSaveDirectory = ConfigurationManager.AppSettings["FileSaveRootDirectory"].ToString();
string SaveDirectoryName = DateTime.Now.Year.ToString() + "." + DateTime.Now.Month.ToString() + "." + DateTime.Now.Day.ToString() + " " + DateTime.Now.Hour.ToString() + "." + DateTime.Now.Minute.ToString() + "." + DateTime.Now.Second.ToString() + "." + DateTime.Now.Millisecond.ToString();
string SaveDirectory = Path.Combine(RootSaveDirectory, SaveDirectoryName);
if (!Directory.Exists(SaveDirectory))
{
Directory.CreateDirectory(SaveDirectory);
}
string FileName = ConfigurationManager.AppSettings["FileName"].ToString();
File.WriteAllText(Path.Combine(SaveDirectory, FileName), FileContent);
returnValue = true;
}
catch { }
return returnValue;
}
}
and the following is the code which I use on the FEZ device to send TCP Packets to the win app on my laptop :
public bool SendFile()
{
bool returnValue = false;
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ServerIP = new IPAddress(new byte[] { 172, 16, 43, 193 });
IPEndPoint ServerEndPoint = new IPEndPoint(ServerIP, 12250);
byte[] buf = Encoding.UTF8.GetBytes(FileContentText);
socket.Connect(ServerEndPoint);
socket.Send(buf);
if (socket.Poll(5 * 1000000, SelectMode.SelectRead)) // wait for data from the server
{
byte[] inbuf = new byte[socket.Available];
socket.Receive(inbuf);
//string m = new string(Encoding.UTF8.GetChars(inbuf));
}
socket.Close();
}
catch (SocketException ex)
{
string s = ex.Message;
if (ex.InnerException != null)
s = s + ex.InnerException.Message;
if (ex.StackTrace != null)
s = s + ex.StackTrace;
}
return returnValue;
}
The issue is that on FEZ device when I try to send tcp packets at the following line of code
socket.Connect(ServerEndPoint);
A SocketException with the following Id is thrown :
10054
I got what the issue was !
in the
page_load
event after :
System.Threading.Thread t = new Thread(new ThreadStart(SendTCPMessage));
I have forgotten to write :
t.Start();