本协议由消息头与消息体组成,结构如下:
消息头 消息体消息头结构如下:
长度 命令代码字段说明:
消息字段 数据类型 长度(字节数) 备注
长度 Int32 4 整条消息的长度,含自身
命令代码 Int32 4 (见下表)每个消息的含义由消息头中的命令代码决定,而不同的命令代码也决定了不同的消息体结构。
命令代码:
命令类型 命令代码
登录命令:Bind 1
应答登录命令:Bind_Resp 101
发送消息命令:Submit 2
应答发送消息命令:Submit_Resp 201
断开连接命令:UnBind 3
检测连接命令:KeepAlive 5
在线列表:OnlineUsers 11
离线列表:OfflineUsers 12(1) 通信初始化
基站启动时,由基站首先发送Bind结构向服务器端发起连接。服务器根据Bind结构中的基站标识号及密码对基站进行合法性验证,如果验证通过,则返回一条Bind_Resp应答给基站,同时服务器将所有中心站的在线及离线列表(如果存在)发送给基站。如果验证不通过,则中断连接。
注:当通信初始化未成功时,基站发往服务器的所有命令都将被服务器拒绝。Bind结构如下:
消息头 基站标识号 密码字段说明:
消息字段 数据类型 长度(字节数) 备注
消息头 消息头结构 8
基站标识号 String 8
密码 String 6
Bind_Resp结构如下:
消息头 登录结果字段说明:
消息字段 数据类型 长度(字节数) 备注
消息头 消息头结构 8
登录结果 Char 1 0表成功
消息头 消息体消息头结构如下:
长度 命令代码字段说明:
消息字段 数据类型 长度(字节数) 备注
长度 Int32 4 整条消息的长度,含自身
命令代码 Int32 4 (见下表)每个消息的含义由消息头中的命令代码决定,而不同的命令代码也决定了不同的消息体结构。
命令代码:
命令类型 命令代码
登录命令:Bind 1
应答登录命令:Bind_Resp 101
发送消息命令:Submit 2
应答发送消息命令:Submit_Resp 201
断开连接命令:UnBind 3
检测连接命令:KeepAlive 5
在线列表:OnlineUsers 11
离线列表:OfflineUsers 12(1) 通信初始化
基站启动时,由基站首先发送Bind结构向服务器端发起连接。服务器根据Bind结构中的基站标识号及密码对基站进行合法性验证,如果验证通过,则返回一条Bind_Resp应答给基站,同时服务器将所有中心站的在线及离线列表(如果存在)发送给基站。如果验证不通过,则中断连接。
注:当通信初始化未成功时,基站发往服务器的所有命令都将被服务器拒绝。Bind结构如下:
消息头 基站标识号 密码字段说明:
消息字段 数据类型 长度(字节数) 备注
消息头 消息头结构 8
基站标识号 String 8
密码 String 6
Bind_Resp结构如下:
消息头 登录结果字段说明:
消息字段 数据类型 长度(字节数) 备注
消息头 消息头结构 8
登录结果 Char 1 0表成功
现在我用方式是这样(被中断): int len, ord;
string user, pwd;
ord = 1;
user = "12345678";//基站标识号
pwd = "123456";//密码
byte[] ser1 = BitConverter.GetBytes(ord);
byte[] ser2 = Encoding.ASCII.GetBytes(user);
byte[] ser3 = Encoding.ASCII.GetBytes(pwd);
byte[] data = new byte[ser1.Length+ ser2.Length + ser3.Length + 4];
byte[] head = BitConverter.GetBytes((int)data.Length);
Array.Copy(head, data, 4);
Array.Copy(ser1, 0, data, 4, ser1.Length);
Array.Copy(ser2, 0, data, 8, ser2.Length);
Array.Copy(ser3, 0, data, 16, ser3.Length); Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Connect(new IPEndPoint(IPAddress.Parse("192.168.16.50"), 8080)); sock.Send(data);// 这就发送过去了
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = sock.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
sock.Close();
http://www.cnblogs.com/tuyile006/archive/2006/12/30/607823.html
[Serializable]
struct Send
{
public int M_order;
public string user;
public string pwd;
} //先声明一个序列化管理器
BinaryFormatter bin = new BinaryFormatter();
//定义一个内存流
MemoryStream stream = new MemoryStream(); private void btn_Sent_Click(object sender, EventArgs e)
{ //定义要发送的对象
Send send = new Send();
//定义对象成员值
send.M_order = 1;
send.user = "dingrixin";
send.pwd = "123456"; //序列化对象到内存流
bin.Serialize(stream, send);
//转化为字节数组
byte[] ser = stream.ToArray();
//销毁流对象,释放内存
stream.Dispose();
//定义要发送到服务器的数据
byte[] data = new byte[ser.Length + 4];
//把长度转化为头文件,头文件里包括了自身的2个字节+有效数据的长度
byte[] head = BitConverter.GetBytes((int)data.Length);
//拷贝头到要发送的数据里
Array.Copy(head, data, 4);
//拷贝数据到要发送的数据里
Array.Copy(ser, 0, data, 4, ser.Length);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Connect(new IPEndPoint(IPAddress.Parse("192.168.16.50"), 8080)); sock.Send(data);// 这就发送过去了
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = sock.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
sock.Close(); }
C++语言
//分配登录包空间
char* czLogin = new char[22]; //创建登录包指针
memset(czLogin,0,22); //初始化登录包 /*************************客户端封包过程******************/
//定义登录包字段,并赋值
int iLen = 22; //消息长度
int iCmd = 1; //命令字段
char* czID = "12345678"; //登录ID,固定8字节
char* czPW = "654321"; //密码,固定6字节 //填充登录包空间
memcpy(czLogin,&iLen,4); //将长度拷贝到登录包
memcpy(czLogin+4,&iCmd,4); //将命令拷贝到登录包
memcpy(czLogin+8,czID,8); //将登录ID拷贝到登录包
memcpy(czLogin+16,czPW,6); //将密码拷贝到登录包