我尝试使用异步套接字通信为服务器/客户端应用程序建立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";
}
答案 0 :(得分:0)
尽管甚至没有确定消息是还是编写任何代码以确定是否已收到消息,但您在某种程度上神奇地期望知道您何时收到“消息”。
在TCP编程社区中有一句老话 - 没有人被允许编写任何使用TCP的代码,直到他们能够100%解释这个真实陈述中的每个单词的含义:
“ TCP是一种可靠的字节流协议,不保留应用程序消息边界。”
您必须编写代码才能实现“消息”。 TCP是字节流协议。如果要发送和接收消息,则需要创建一个执行此操作的协议。
首先定义消息是什么,如何分隔消息,等等。然后编写代码以根据您的定义发送和接收消息。调用onReceive
函数时,这意味着TCP / IP堆栈收到了一些字节 - 您需要通过遵循消息传递协议的规则来决定是否是消息。