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

时间:2014-04-26 08:02:06

标签: c# sockets asynchronous tcp

我尝试使用异步套接字通信为服务器/客户端应用程序建立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";
    }

1 个答案:

答案 0 :(得分:0)

尽管甚至没有确定消息还是编写任何代码以确定是否已收到消息,但您在某种程度上神奇地期望知道您何时收到“消息”。

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

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

您必须编写代码才能实现“消息”。 TCP是字节流协议。如果要发送和接收消息,则需要创建一个执行此操作的协议。

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