谁有一个用c的socket传送特殊格式数据包的例子?具体格式如下:

rightgoer 2004-05-08 11:34:45
消息头的格式:
Message Length 4 Integer 消息的总长度(字节)
Command ID 4 Integer 命令ID
Sequence Number 12 Integer 序列号
消息体的格式:
Login Type 1 Integer 登录类型。1:SP向IDMS建立的连接,用
于发送命令
2:IDMS向SP建立的连接,用
于发送命令
3:SP与IDMS之间建立的测试
连接,用于跟踪测试其
它:保留
Login Name 16 Text 服务器端给客户端分配的登录名
Login Passowrd 16 Text 服务器端和Login Name对应的密码
Reserve 8 Text 保留,扩展用

哪位侠客能给做出来?万分感谢,或着给些这方面的资料,尤其是怎么定义数据,
怎么把消息组装起来,请多赐教!
...全文
146 11 点赞 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ChenYongThread 2004-08-12
up
  • 打赏
  • 举报
回复
gaoxianfeng 2004-05-09
Message Length 4 Integer 消息的总长度(字节)
Command ID 4 Integer 命令ID
Sequence Number 12 Integer 序列号
消息体的格式:
Login Type 4/*改成4字节吧,好操作*/ Integer 登录类型。1:SP向IDMS建立的连接,用
于发送命令
2:IDMS向SP建立的连接,用
于发送命令
3:SP与IDMS之间建立的测试
连接,用于跟踪测试其
它:保留
Login Name 16 Text 服务器端给客户端分配的登录名
Login Passowrd 16 Text 服务器端和Login Name对应的密码
Reserve 8 Text 保留,扩展用


struct data{
int a;
int b;
char c[12];
int d;
char e[16];
char f[16];
char g[8];
};
/*send*/
struct data send;
memset((void*)&send, 0, sizeof(send));

send.a = htonl(sizeof(send));
send.b = htonl(id);
memcpy((void*)(send.c), seq, 12);
send.d = htonl(type);
strncpy(send.e, name, 15);
strncpy(send.f, pass, 15);
strncpy(send.g, msg, 7);

send(fd, (const void*)&send, sizeof(send), 0);


/*recv*/
u_char tmp[128];
int recv_len=0;
int reVal=0;
struct data recv;

memset((void*)tmp, 0, sizeof(tmp));
memset((void*)&recv, 0, sizeof(recv));
do{
if((reVal = recv(fd, (void*)&tmp, sizeof(recv)-recv_len, 0)) == -1)
/*不继续处理*/;
recv_len += reVal;
}while(recv_len < sizeof(recv));
memcpy((void*)&recv, tmp, sizeof(recv));
memcpy((void*)tmp, &(tmp[sizeof(recv)]), recv_len - sizeof(recv));
/*记录一下剩余长度保存*/
/*然后按发送端相反的处理就成了 累了 :(*/
/*sizeof结构时没typedef要加sturct*/
  • 打赏
  • 举报
回复
tianxiangyuan 2004-05-09
将这些杂七杂八的东东放在一个buffer中,然后调用send或recv就行了。
  • 打赏
  • 举报
回复
rightgoer 2004-05-09
万分感谢!
  • 打赏
  • 举报
回复
xiaoluoli 2004-05-09
大家看看(xiaoluoli)的帖子;
快来有分哦
  • 打赏
  • 举报
回复
tibet 2004-05-09
做个结构
typedef struct msgHead
{
int length;
int command;
char seqnum[12];
}msgHeadDef;

typedef struct loginMsg
{
msgHeadDef msg_head;
char type;
char name[16];
char passwd[16];
char reserve[256];
}loginMsgDef;
  • 打赏
  • 举报
回复
痞子酷 2004-05-09
struct _MSG
{
int Length;
char Type;
char userName[16];
char Password[16];
char others[30];
}MSG;
MSG strMsgBuf;

send(sockfd,(char *)strMsgBuf,sizeof(strMsgBuf));
//注意解包和大包时Length的显示顺序:从高字节到低字节 还是从低字节到高字节
  • 打赏
  • 举报
回复
laopang 2004-05-09
这里面有个问题,那个
Message Length 4 Integer 消息的总长度(字节)

4是不是4个字节?如果是,那么后面那个序列号12个字节,天哪,2的96次方...如果是4位,那么长度最大只有16?



  • 打赏
  • 举报
回复
rightgoer 2004-05-08
请举个简单的例子好吗?
Message Length 4 Integer 消息的总长度(字节)
也可以放在字符串里吗?
万分感谢!
  • 打赏
  • 举报
回复
番茄家 2004-05-08
可以把它们全部放在一个字符串中。
  • 打赏
  • 举报
回复
Ashnu 2004-05-08
查一下sendmsg和recvmsg这两个函数的用法.用它们来组包最方便不过了 :)
  • 打赏
  • 举报
回复
相关推荐
发帖
Linux/Unix社区
加入

2.1w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
帖子事件
创建了帖子
2004-05-08 11:34
社区公告
暂无公告