本协议由消息头与消息体组成,结构如下:
消息头 消息体消息头结构如下:
长度 命令代码字段说明:
消息字段 数据类型 长度(字节数) 备注
长度 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表成功

解决方案 »

  1.   

    补充:
    现在我用方式是这样(被中断):             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();
      

  2.   

    这个可能对你有帮助
    http://www.cnblogs.com/tuyile006/archive/2006/12/30/607823.html
      

  3.   

    再补充:也用过结构体方式:(也是不成功)
             [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();        }
      

  4.   

    什么问题? 是不是flash 安全机制的缘故
      

  5.   

    你让服务器查查 tcp dump 里有数据没有
      

  6.   

    再补充(服务器方提供的例子):
    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);       //将密码拷贝到登录包