做一家公司产品的数据接收(局域网内)
该公司收来说明文档如下:请问我应该怎么接收他的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]
}

解决方案 »

  1.   

    /// <summary>
    /// 开始监听
    /// </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);
    }
    }
      

  2.   

    十分感谢duan17(CM) ,我去测试一下,谢谢!!!!
      

  3.   

    duan17(CM) :     hander1 = listener.Accept();              //接收客户端的连接以上这句中的listener没有声明???应该怎么改???采用多线程监听有什么好处吗?简单说明一下原理好吗?谢谢!!!!麻烦你了,如果分不够,我另再开帖加分!!!!!!!!!!!!!!!!11
      

  4.   

    /**
     * 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();
    }
      

  5.   

    声明一下private Socket listener;
    因为监听的代码是线程阻塞的,所以要用多线程
      

  6.   

    如果不使用多线程,当被监听端口无网络数据时,整个进程会阻塞在那里,具体表现为整个进程都不会动了,你点什么都没有响应,直到有数据来了为止......
    singleflower(诗凡(愿父亲安息)) 的意思应该是只用一个主进程派生的线程来收数据。
    从某种意义上讲,派生了一个线程,就可以说这是多线程了。
      

  7.   

    本人喜欢用异步,不过比较麻烦。例子服务端
    ---------------------------------------------------------------------------------
    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;
        }
    }
    ---------------------------------------------------------------------------------
      

  8.   

    客服端
    ---------------------------------------------------------------------------------
    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;
        }
    }
    ---------------------------------------------------------------------------------
      

  9.   

    谢谢  maggice() 的解说,同样感谢 JzeroBiao(先知) 提供的示例,谢谢热心的大家!!!!我再做些测试,还望各位再帮我讨论一下这个问题,再次感谢大家!!!!
      

  10.   

    duan17(CM)的方法好像是正解,我用他的方法已完成了项目,谢谢了