做一家公司产品的数据接收(局域网内)
该公司收来说明文档如下:请问我应该怎么接收他的TCP包,请高人指教,谢谢,分不够我另开帖给,谢谢!!!本人没做过TCP包接收的程序,看MSDN好像要求端口号的,我是否要找对方要端口号????
上次发帖,有人指点了如何拆分字符,但我不明白应该怎么接收他的TCP包,求各位高人能给个接收的代码(示例),万分感谢!!!!!------------------------------------------------------------------------------------------TCP 包 连接成功后发送
数据分两种,违章记录和设备状态,以'VEHI'和'INFO'标志
struct dbf
{
CHAR HEAD[4]'VEHI'
char bh [6]; 路口编号(4位)+相机编号(1)+车道编号(1)
char date [10]; 日期: YYYY.MM.DD
char redtime [8]; 红灯点亮时间: HH:MM:SS
char taketime [5]; 拍照时间: 红灯点亮后xxx.x秒
char redlast [5]; 红灯长度: xxx.x秒
char violation [30]; 违法类型:
char filename [40]; 文件名: FTP服务器下的子目录+文件名 后缀为JPG,同目录下有同名MP4文件(文件名相同,后缀为mp4)
char address [40]; 违法地点
char direction [20]; 方向
char driveway[3]; 车道类型: 1左转弯 2直行 3右转弯
char crc32[4] 校验
}
设备状态信息
struct DeviceInfo
{
CHAR HEAD[4] 'INFO'
char bh[6]; 路口编号(4位)+相机编号(1)+'D'
char date [10]; 日期: YYYY.MM.DD
char detecttime [8]; 检测时间: HH:MM:SS
char computer 主机状态 '0' 代表正常 其它代表故障
char camera[4] 相机状态 '0' 代表正常 其它代表故障,没有该设备用'0'补足
char lamp[4] 车道1-4红灯状态 '0' 代表正常 '1'代表故障
char coil[8] 车道1-4线圈状态 '0' 代表正常 '1'代表故障 每个车道2位
char temp[5] 温度,小数1位
CHAR CRC32[4]
}
该公司收来说明文档如下:请问我应该怎么接收他的TCP包,请高人指教,谢谢,分不够我另开帖给,谢谢!!!本人没做过TCP包接收的程序,看MSDN好像要求端口号的,我是否要找对方要端口号????
上次发帖,有人指点了如何拆分字符,但我不明白应该怎么接收他的TCP包,求各位高人能给个接收的代码(示例),万分感谢!!!!!------------------------------------------------------------------------------------------TCP 包 连接成功后发送
数据分两种,违章记录和设备状态,以'VEHI'和'INFO'标志
struct dbf
{
CHAR HEAD[4]'VEHI'
char bh [6]; 路口编号(4位)+相机编号(1)+车道编号(1)
char date [10]; 日期: YYYY.MM.DD
char redtime [8]; 红灯点亮时间: HH:MM:SS
char taketime [5]; 拍照时间: 红灯点亮后xxx.x秒
char redlast [5]; 红灯长度: xxx.x秒
char violation [30]; 违法类型:
char filename [40]; 文件名: FTP服务器下的子目录+文件名 后缀为JPG,同目录下有同名MP4文件(文件名相同,后缀为mp4)
char address [40]; 违法地点
char direction [20]; 方向
char driveway[3]; 车道类型: 1左转弯 2直行 3右转弯
char crc32[4] 校验
}
设备状态信息
struct DeviceInfo
{
CHAR HEAD[4] 'INFO'
char bh[6]; 路口编号(4位)+相机编号(1)+'D'
char date [10]; 日期: YYYY.MM.DD
char detecttime [8]; 检测时间: HH:MM:SS
char computer 主机状态 '0' 代表正常 其它代表故障
char camera[4] 相机状态 '0' 代表正常 其它代表故障,没有该设备用'0'补足
char lamp[4] 车道1-4红灯状态 '0' 代表正常 '1'代表故障
char coil[8] 车道1-4线圈状态 '0' 代表正常 '1'代表故障 每个车道2位
char temp[5] 温度,小数1位
CHAR CRC32[4]
}
/// 开始监听
/// </summary>
private void StartListen()
{
Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//取得本机IP地址
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0]; //监听2001端口
IPEndPoint localEndPoint = new IPEndPoint(ipAddress,RecePort);
listener.Bind(localEndPoint);
listener.Listen(10); //采用多线程监听
Thread t = new Thread(new ThreadStart(RegListener));
t.IsBackground = true;
t.Start();
} /// <summary>
/// 注册监听
/// </summary>
private void RegListener()
{
string data = "";
byte[] byte1 =new byte[1024];
Socket hander1 = null;
while(true)
{
try
{
hander1 = listener.Accept(); //接收客户端的连接
int byteLength = hander1.Receive(byte1); //接收数据
data = Encoding.Unicode.GetString(byte1,0,byteLength);
}
catch(Exception ex)
{
this.ProcessError(ex.Message,"RegListener");
}
//关闭连接
hander1.Shutdown(SocketShutdown.Both);
if (hander1.Connected)
hander1.Close(); if (data != "")
this.ProcessClientMessage(data);
}
}
* The following function creates a TcpServer that connects to
* the specified port (13000).Any TcpClient that wants to use this server
* has to explicitly connect to an address obtained by the combination of
* the sever on which this TCpServer is runnig and the port 13000.
* This TcpServer simply echoes back the message sent by the TcpClient, after
* translating it into uppercase.
* Refer to the related client in the TcpClient class.
**/
public static void Main()
{
try
{
// Set the TcpListener on port 13000.
Int32 port = 13000;
TcpListener server = new TcpListener(port); // Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null; // Enter the listening loop.
while(true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
// You could also user server.AcceptSocket() here.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!"); data = null; // Get a stream object for reading and writing
NetworkStream stream = client.GetStream(); Int32 i; // Loop to receive all the data sent by the client.
while((i = stream.Read(bytes, 0, bytes.Length))!=0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine(String.Format("Received: {0}", data));
// Process the data sent by the client.
data = data.ToUpper(); Byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); // Send back a response.
stream.Write(msg, 0, msg.Length);
Console.WriteLine(String.Format("Sent: {0}", data));
}
// Shutdown and end connection
client.Close();
}
}
catch(SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
因为监听的代码是线程阻塞的,所以要用多线程
singleflower(诗凡(愿父亲安息)) 的意思应该是只用一个主进程派生的线程来收数据。
从某种意义上讲,派生了一个线程,就可以说这是多线程了。
---------------------------------------------------------------------------------
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;// State object for reading client data asynchronously
public class StateObject {
// Client socket.
public Socket workSocket = null;
// Size of receive buffer.
public const int BufferSize = 1024;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}public class AsynchronousSocketListener {
// Incoming data from client.
public static string data = null; // Thread signal.
public static ManualResetEvent allDone = new ManualResetEvent(false); public AsynchronousSocketListener() {
} public static void StartListening() {
// Data buffer for incoming data.
byte[] bytes = new Byte[1024]; // Establish the local endpoint for the socket.
// The DNS name of the computer
// running the listener is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); // Create a TCP/IP socket.
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp ); // Bind the socket to the local endpoint and listen for incoming connections.
try {
listener.Bind(localEndPoint);
listener.Listen(100); while (true) {
// Set the event to nonsignaled state.
allDone.Reset(); // Start an asynchronous socket to listen for connections.
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener ); // Wait until a connection is made before continuing.
allDone.WaitOne();
} } catch (Exception e) {
Console.WriteLine(e.ToString());
} Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
} public static void AcceptCallback(IAsyncResult ar) {
// Signal the main thread to continue.
allDone.Set(); // Get the socket that handles the client request.
Socket listener = (Socket) ar.AsyncState;
Socket handler = listener.EndAccept(ar); // Create the state object.
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
} public static void ReadCallback(IAsyncResult ar) {
String content = String.Empty;
// Retrieve the state object and the handler socket
// from the asynchronous state object.
StateObject state = (StateObject) ar.AsyncState;
Socket handler = state.workSocket; // Read data from the client socket.
int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) {
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(
state.buffer,0,bytesRead)); // Check for end-of-file tag. If it is not there, read
// more data.
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1) {
// All the data has been read from the
// client. Display it on the console.
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
content.Length, content );
// Echo the data back to the client.
Send(handler, content);
} else {
// Not all data received. Get more.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
}
private static void Send(Socket handler, String data) {
// Convert the string data to byte data using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device.
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler);
} private static void SendCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket handler = (Socket) ar.AsyncState; // Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("Sent {0} bytes to client.", bytesSent); handler.Shutdown(SocketShutdown.Both);
handler.Close(); } catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
public static int Main(String[] args) {
StartListening();
return 0;
}
}
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;// State object for receiving data from remote device.
public class StateObject {
// Client socket.
public Socket workSocket = null;
// Size of receive buffer.
public const int BufferSize = 256;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}public class AsynchronousClient {
// The port number for the remote device.
private const int port = 11000; // ManualResetEvent instances signal completion.
private static ManualResetEvent connectDone =
new ManualResetEvent(false);
private static ManualResetEvent sendDone =
new ManualResetEvent(false);
private static ManualResetEvent receiveDone =
new ManualResetEvent(false); // The response from the remote device.
private static String response = String.Empty; private static void StartClient() {
// Connect to a remote device.
try {
// Establish the remote endpoint for the socket.
// The name of the
// remote device is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); // Create a TCP/IP socket.
Socket client = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp); // Connect to the remote endpoint.
client.BeginConnect( remoteEP,
new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne(); // Send test data to the remote device.
Send(client,"This is a test<EOF>");
sendDone.WaitOne(); // Receive the response from the remote device.
Receive(client);
receiveDone.WaitOne(); // Write the response to the console.
Console.WriteLine("Response received : {0}", response); // Release the socket.
client.Shutdown(SocketShutdown.Both);
client.Close();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
} private static void ConnectCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket client = (Socket) ar.AsyncState; // Complete the connection.
client.EndConnect(ar); Console.WriteLine("Socket connected to {0}",
client.RemoteEndPoint.ToString()); // Signal that the connection has been made.
connectDone.Set();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
} private static void Receive(Socket client) {
try {
// Create the state object.
StateObject state = new StateObject();
state.workSocket = client; // Begin receiving the data from the remote device.
client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
} private static void ReceiveCallback( IAsyncResult ar ) {
try {
// Retrieve the state object and the client socket
// from the asynchronous state object.
StateObject state = (StateObject) ar.AsyncState;
Socket client = state.workSocket; // Read data from the remote device.
int bytesRead = client.EndReceive(ar); if (bytesRead > 0) {
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead)); // Get the rest of the data.
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
new AsyncCallback(ReceiveCallback), state);
} else {
// All the data has arrived; put it in response.
if (state.sb.Length > 1) {
response = state.sb.ToString();
}
// Signal that all bytes have been received.
receiveDone.Set();
}
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
} private static void Send(Socket client, String data) {
// Convert the string data to byte data using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device.
client.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), client);
} private static void SendCallback(IAsyncResult ar) {
try {
// Retrieve the socket from the state object.
Socket client = (Socket) ar.AsyncState; // Complete sending the data to the remote device.
int bytesSent = client.EndSend(ar);
Console.WriteLine("Sent {0} bytes to server.", bytesSent); // Signal that all bytes have been sent.
sendDone.Set();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
public static int Main(String[] args) {
StartClient();
return 0;
}
}
---------------------------------------------------------------------------------