谁有一个用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 保留,扩展用

哪位侠客能给做出来?万分感谢,或着给些这方面的资料,尤其是怎么定义数据,
怎么把消息组装起来,请多赐教!
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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这两个函数的用法.用它们来组包最方便不过了 :)

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧