1-我有一台GHIElectronics FEZ Spider 3设备
2-我已通过以太网电缆将设备连接到笔记本电脑并配置了网络设置
3-我可以使用cmd:ping 172.16.43.193
从笔记本电脑上ping FEZ设备4-我已经知道一个Windows窗体应用程序可以在我的笔记本电脑上运行并充当TCP接收器
5-我想从FEZ设备向我的笔记本电脑上的win app发送TCP数据包
以下是获胜应用代码:
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;
}
}
以下是我在FEZ设备上用来将TCP数据包发送到笔记本电脑上的win应用程序的代码:
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;
}
问题是当我尝试在以下代码行发送tcp数据包时在FEZ设备上
socket.Connect(ServerEndPoint);
抛出带有以下Id的SocketException:
10054
答案 0 :(得分:1)
我假设在你的情况下socket.Poll()
在数据到达之前立即返回false,当它离开using
块的范围时关闭套接字。
如果我的假设是正确的,我会重写ProcessRequest
方法 - 跳过Poll()
和Socket.Available
检查,然后只使用socket.Receive()
。
socket.Receive()
将阻止(您的工作线程)直到收到响应,如果远程方断开连接则返回0。
类似的东西:
using (m_clientSocket)
{
int bytes;
while ((bytes = m_clientSocket.Receive(...)) > 0)
{
// process "bytes" bytes from the buffer
}
// other side has disconnected
}
不要忘记在那个例程中抓住SocketException
。
答案 1 :(得分:1)
我遇到了问题!
中的
page_load
之后的事件:
System.Threading.Thread t = new Thread(new ThreadStart(SendTCPMessage));
我忘了写:
t.Start();