如何定义自己的协议?急!!!!!!!!!高分!
我现在遇到难题。我的想法是开发一个c/s模式程序,程序功能是:能对提取数据库记录,然后对数据打包,然后发送。当然通讯的前期,有三路握手,再就是用户和密码验证。谁能先告诉我怎么定义一个自己的协议。问题解决,有更高分。 问题点数:100、回复次数:13Top
1 楼ljmanage(过客)回复于 2006-01-14 11:00:45 得分 0
你这个要在服务器端有个软件接收客户端指令,你可以用Socket实现,具体里面的协议你自己定,比如说,开始几个字节是机器名啊,什么的,也可以直接将一个结构体发过去,服务器端同样的用结构体接收下来,然后在对里面的数据进行分解作具体操作Top
2 楼tlhad()回复于 2006-01-14 11:26:32 得分 0
能讲详细一点吗?或者给一小段例子代码。问题解决有高分,不胜感激啊!你是指当一个用户登陆进来以后,在发个数据结构过去,然后客户端再把用户和密码发过来,然后我读结构信息,然后判断是否成功。如果成功,我再回复登陆成果。客户端收到登陆成功后,开始发送信息,服务器端也开始转发信息?请回复。继续讨论。Top
3 楼CW_Wei(朗 月)回复于 2006-01-14 12:01:20 得分 0
协议不就是自己规定某些特殊信息的意义么Top
4 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2006-01-14 12:02:16 得分 0
中间的数据传送,你可以自己构建字节数组,比如第1~第n字节,存放用户名,第n+1~第n+m字节,存放密码。用户名和密码也可以加密。算法你可以自己选。Top
5 楼DrSmart(斯玛特)回复于 2006-01-14 12:25:35 得分 0
你可以搜索一下 密聊 的源代码Top
6 楼tlhad()回复于 2006-01-14 14:04:07 得分 0
数据从客户端出来是这样的--加TCP头+数据->加IP头+TCP头+数据-》最后封装成桢,发送出去。然后服务器端解包,再到应用程度读取数据。这个过程需要我自己操作吗?难道,那些验证信息是放在数据里面。而另一方只是取这个结构数据里的一个成员来验证?比方:struct LOGIN_USE
{
CString u_name,//需验证的客户端用户名
CString u_pwd,//密码
char[1024] content,//保存信息主内容
};
这样简单定义。可以发送这中结构数据吗?
请高手指点。不胜感激。尽管发言,虚心接受。谢谢!~@~Top
7 楼Victorianism(风尚)回复于 2006-01-15 15:11:40 得分 0
首先你要定义一组消息命令,用这些消息来识别是一个什么样的操作,在服务端取出这个消息然后跟据这些消息用不同的结构去收取就行了
例如:
#define MSG_LOGIN 0x001
#define MSG_LOGOUT 0x002
#define MSG_CHANGE_PWD 0x003
....
然后定义一个结构存放一个数据信息,数据的收发都用这个结构来处理
例如:
struct _DATAPACKET
{
int version; // 协议版本,为了兼容不同版本的客户服务端应该跟据这个版本来处理
int message; // 保存这个消息命令
int uid; // 用户ID
int verify; // 校验码,如果客户需要收到服务端的ACK(消息应答),跟据这个校码来判断
int length; // 实际数据长度
char buffer[1024]; // 缓冲区
};
用户登录结构:
struct _LOGIN
{
char encrypt[16]; // 加密键
char password[32]; // 经过的密码
};
....
下面来看看是怎样处理客户端服务端对话的:
客户端如下:
struct _DATAPACKET stPack;
struct _LOGIN stLogin;
memset(&stPack, 0, sizeof(stPack));
memset(&stLogin, 0, sizeof(stLogin));
在这里可能要用strcpy()函数
stLogin.encrypt = "加密键";
stLogin.password = "你的密码";
stPack.version = 1;
stPack.message = MSG_LOGIN;
stPack.uid = 88888;
stPack.verify = xxx; // 这个校验码应该是一个随机数
stPack.length = sizeof(stLogin); // _LOGIN结构的大小,以字节为单位
//然后把_LOGIN结构封装到stPack中去
memcpy(&stPack.buffer, &stLogin, sizeof(stLogin));
//OK最后直接将_DATAPACKET这个构结发送出去就行了
sendto(s, (char*)&stPack, sizeof(stPack), 0, ...);
//好了然后我们来演示在服务器端是怎样收取这个结构
_DATAPACKET stPack;
memset(&stPack, 0, sizeof(stPack));
recvfrom(s, (char*)&stPack, sizeof(stPack), 0, ...);
int message = stPack.message;
switch(message)
{
case MSG_LOGIN:
_LOGIN stLogin;
memcpy(&stLogin, stPack.buffer, stPack.length);
// 好了下面就可以去做你要做的事情了.
break;
case MSG_LOGOUT:
break;
};Top
8 楼Victorianism(风尚)回复于 2006-01-15 15:16:30 得分 0
以上协议仅供参考,协议定义的方式可能有些不同,你可以跟据自已的需要来定义.Top
9 楼jia20003(『gloomy fish』兄弟们一个一个结婚刺激我想跳楼!)回复于 2006-01-16 12:35:23 得分 0
多看看TCP之上的应用协议如何定义和规则过滤对你肯定有
帮助!找点RFC文档看看吧!Top
10 楼zephyr007(道可道)回复于 2006-01-16 13:06:56 得分 0
可以使用XMLTop
11 楼leon358(骷髅在跳舞)回复于 2006-01-16 13:36:18 得分 0
能力不在裤衩的多少,看看人家--Victorianism(风尚),学习Top
12 楼0011411(爱也许是假的,可是当时的快乐是真的。)回复于 2006-01-16 15:08:08 得分 0
Victorianism(风尚) 的裤衩虽然少,但是很猛哦!!!哈哈Top
13 楼Victorianism(风尚)回复于 2006-01-16 15:13:39 得分 0
裤衩不在多,好用则行!Top



