在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";
}
尽管您甚至没有决定消息是什么,也没有编写任何代码来确定是否收到消息,但您还是神奇地希望知道自己何时收到了"消息"。
TCP编程社区有一句老话——任何人都不允许编写任何使用TCP的代码,直到他们能够100%解释这个真实语句中的每个单词的含义:
"TCP是一种可靠的字节流协议,不保留应用程序消息边界。"
您必须编写代码才能实现"消息"。TCP是一种字节流协议。如果你想发送和接收消息,你需要创建一个这样做的协议。
首先定义消息是什么,如何分隔消息等等。然后根据您的定义编写发送和接收消息的代码。当调用onReceive
函数时,这只意味着TCP/IP堆栈接收到一些字节——您需要按照消息传递协议的规则来决定这是否是一条消息。