1-我有一个Ghielectronics FEZ Spider 3设备
2-我已通过以太网电缆将设备连接到笔记本电脑,并配置了网络设置。
3-我可以使用命令ping 172.16.43.193从笔记本电脑ping fez设备。
4-我已经编写了一个windows窗体应用程序,可以在我的笔记本电脑上运行,并充当tcp接收器
5-我想从fez设备向笔记本电脑上的win应用程序发送tcp数据包
以下是Win应用程序代码:
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设备上用来向笔记本电脑上的win应用程序发送tcp数据包的代码:
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;
}
问题是在fez设备上,当我尝试在下面的代码行发送tcp包时
socket.Connect(ServerEndPoint);
引发具有以下ID的SocketException:
10054
最佳答案
在您的例子中,我假设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
s。