在c#中使用异步套接字通信通过TCP/IP连接接收数据后出错

本文关键字:连接 IP 出错 数据 TCP 异步 通信 套接字 | 更新日期: 2023-09-27 18:00:10

我曾尝试通过异步套接字通信为服务器/客户端应用程序建立TCP/IP连接,并取得了成功。但是,我无法显示客户端收到的所有消息。我有运行时错误,请问问题出在哪里。

  private void onreceive(IAsyncResult ar)
        {
                Socket clientsocket = (Socket)ar.AsyncState;
               int byteread = clientsocket.EndReceive(ar);
                data msgreceived = new data(byteData,byteread);
                data msgtosend = new data();
                byte[] message;
                ClientInfo clientinfo = new ClientInfo();
                clientinfo.socket = clientsocket;
                IPEndPoint remote = clientsocket.RemoteEndPoint as IPEndPoint;
                remoteip = remote.Address;
                clientinfo.IMEI = msgreceived.IMEI;
                clientlist.Add(clientinfo);
                msgtosend.strMessage = "client with ip address " + remoteip + " with this IMEI " + clientinfo.IMEI;
                txtLog.Text += msgreceived.strMessage + "'r'n";
                if (clientinfo.socket.Connected == true)
                {
                   clientsocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(onreceive), clientsocket);
                }}

在数据类中:

     public data(byte[] Data, int msglen)
    {
        //int imeilen = BitConverter.ToInt32(Data, 0);
        //int msglen = BitConverter.ToInt32(Data, 4);
       //if (imeilen > 0)
          // this.IMEI = Encoding.ASCII.GetString(Data, 8, imeilen);
        //else this.IMEI = "unknown";
        if (msglen > 0)
            this.strMessage = Encoding.ASCII.GetString(Data,0, msglen);
        else
            this.strMessage = "no message";
    }

在c#中使用异步套接字通信通过TCP/IP连接接收数据后出错

尽管您甚至没有决定消息是什么,也没有编写任何代码来确定是否收到消息,但您还是神奇地希望知道自己何时收到了"消息"。

TCP编程社区有一句老话——任何人都不允许编写任何使用TCP的代码,直到他们能够100%解释这个真实语句中的每个单词的含义:

"TCP是一种可靠的字节流协议,不保留应用程序消息边界。"

您必须编写代码才能实现"消息"。TCP是一种字节流协议。如果你想发送和接收消息,你需要创建一个这样做的协议。

首先定义消息是什么,如何分隔消息等等。然后根据您的定义编写发送和接收消息的代码。当调用onReceive函数时,这只意味着TCP/IP堆栈接收到一些字节——您需要按照消息传递协议的规则来决定这是否是一条消息。