急哪位高手帮解决一下

domaimai 2005-09-02 04:37:22
我现在开发一个系统,在服务器上采用多线程,当一个客户连接时产生一个socket数,现我想将这个数和这个用户发送到服务器上的数据放到一起后send 到其它客户端,然后将这个数与数据分离不知如何解决(数据捆绑问题和分开的问题)
下面是我写的不对但供参考
注:count socket数(int)
buff [30000]客户数据(char*)
void sendtoall(SOCKET s,char *buff,char *count)
{
char *packet=new char[30000];
int n;
n=strlen(count);
packet[0]=n;
//
memcpy(&packet[1],count,n);
// Data length
packet[n+1]=(char)strlen(buff);
memcpy(&packet[n+2],buff,strlen(buff));
send(msgsock[i],packet,30000,0);

}
...全文
71 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifengice0706 2005-09-03
  • 打赏
  • 举报
回复
设计一个小协议:
消息长度:(DWORD)(注:不包含长度的这4个字节)
socket描述(n个字节)(注:相当于楼主的count)
分割符(\0)
数据区(n个字节) (注:相当于楼主的buff)
分割符(\0)

client:

DWORD Len = 0;
int DataLen = 0;

char packet[30000];
memset(packet,0,30000);

DataLen = strlen(count);
Len +=(DataLen+1);
memcpy(packet+4,count,DataLen);

DataLen = strlen(buff);
memcpy(packet+4+Len,buff,DataLen);
Len +=(DataLen+1);

*(DWORD *)packet = (DWORD)Len;

send(msgsock[i],packet,Len+4,0);

server:
解包逻辑,此时count和buff酷似c中的字符串,解起来容易。


没ide,笔误勿怪。


dirdirdir3 2005-09-03
  • 打赏
  • 举报
回复
char *packet=new char[30000];
int n;
n=strlen(count);
packet[0]=n;
//
memcpy(&packet[1],count,n);
// Data length
packet[n+1]=(char)strlen(buff);
memcpy(&packet[n+2],buff,strlen(buff));
send(msgsock[i],packet,n+strlen(buff)+1,0);
oyljerry 2005-09-02
  • 打赏
  • 举报
回复
直接先用CString格式好字符串,然后LPCSTR等转换成char*好了
jjiaming 2005-09-02
  • 打赏
  • 举报
回复
不好意思,上面的写错了
CString str;
str.Format("%d ",count);
memcpy(&packet,str,str.GetLength());
packet += str.GetLength();

str.Format("%d ",strlen(buff));
memcpy(&packet,str,str.GetLength());
packet += str.GetLength();
memcpy(&packet[1],buff,strlen(buff));
send(msgsock[i],packet,30000,0);

jjiaming 2005-09-02
  • 打赏
  • 举报
回复
memcpy(&packet[1],count,n);
packet[n+1]=(char)strlen(buff);
这两句不太好.
CString str;
str.Format("%d ",count);
memcpy(&packet,str,str.GetLength());
packet += str.GetLength();
packet[0] = ' ';
memcpy(&packet[1],count,n);
packet += count + 1;
packet[0] = ' ';
str.Format("%d ",strlen(buff));
memcpy(&packet[1],str,str.GetLength());
packet += str.GetLength();
packet[0] = ' ';
memcpy(&packet[1],buff,strlen(buff));
send(msgsock[i],packet,30000,0);

请楼主注意各数据之间都是以空格分开的
解包时可以用sscanf()函数将各数据分开.
这个函数在msdn里可以查到
younggle 2005-09-02
  • 打赏
  • 举报
回复
看看下面的源代码,可以帮助你解决:
http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1454

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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