我用socket练习作一个简单的聊天工具,服务器端用CList保存了当前在线用户列表,CList的模板参数为一个结构体,结构体中保存了用户的IP,端口等信息,我想把这个CList发送给客户端,在服务器端,我是直接
send(&UserList,sizeof(UserList)),然后在客户端,声明了一个CList对象,receive(&UserList,sizeof(UserList)),但是客户端接收不成功,客户端的接收我感觉是有问题的,我想请教一下,如何把这个列表发送给客户端并让客户端接收这个CList?
send(&UserList,sizeof(UserList)),然后在客户端,声明了一个CList对象,receive(&UserList,sizeof(UserList)),但是客户端接收不成功,客户端的接收我感觉是有问题的,我想请教一下,如何把这个列表发送给客户端并让客户端接收这个CList?
解决方案 »
- MFC CSocket::Send 发送失败,程序无反应
- 在VC中建立了一个socket用于通讯,如何看这个socket属于TCP还是UDP
- sql server 自动编号id删除后如何自动排号
- 如何强制CDataGrid更新数据库?
- 请大家帮忙分析一下这个问题:视频传输程序的服务器端的数据发送问题(UDP)
- ActiveX控件,“在静态库中使用MFC”,怎么找不到系统光标资源啊?当“在共享DLL中使用MFC”时却一切正常,高手过来接分啦!详情请进!
- 请问有谁知道microsoft的Agent小精灵该如何编程使用?
- 在mfc中如何将float型转换成CString型
- CRecordset类如何查找记录集?
- vc中有全局函数吗?????
- 串口自己给自己发
- vc/opengl调用AVI视频,如何把背景处理透明
建议在服务器端将所有用户信息用特殊的分隔符(如'\xFF')拼成一个字符串,然后发送给客户端。客户端再根据这个分隔符拆分得到
1、自定义个结构体,使用简单数据类型如char[]、int等,里面保存用户信息再定义个结构体数组,把数据全部保存在数组里面,最后把整个数组中的数据发送过去就OK了
2、把用户消息写在XML里面,然后发送过去
3、用Google的Buffer也不错
4、用Matrix_Designer的方法也行,我第一次传送文件列表时也是用这种方法的
这个似乎不行,请见:
《郁闷了!写socket时,无法将结构体转换成char*发送》
http://topic.csdn.net/u/20100915/22/6e045577-34cc-4280-ab28-537ca21800bc.html?94786
增加一个头文件 放结构体
struct customer
{
int port;
char ip[];
}在要发送的CPP中
customer buf;
memset(&buf,0,sizeof(buf));
buf.port=......;
buf.ip=........;
sendto(socket,char* buf,len);
不知道能不能帮到你
#pragma pack(1)
typedef struct client
{
unsigned short port;
long ip;
} client;typedef struct users
{
int len;
int count;
client user[1];
} users;#pragma pack()CList<client, client> clients;// 服务器端代码: client clt;
clt.ip = inet_addr("127.0.0.1");
clt.port = htons(8000);
clients.AddHead(clt); clt.ip = inet_addr("192.168.1,10");
clt.port = htons(8000);
clients.AddHead(clt); int nCount = clients.GetCount();
if(nCount==0)
return; int len = sizeof(users)+(nCount-1)*sizeof(client);
users * pUsers = (users *)malloc(len);
if(pUsers==NULL)
return; pUsers->len = len;
pUsers->count = nCount; POSITION pos;
pos = clients.GetHeadPosition();
int i=0;
while (pos)
{
client clt = clients.GetNext(pos);
pUsers->user[i].ip=clt.ip;
pUsers->user[i].port = clt.port;
} send(m_socket,(char *)pUsers,len,0);
free(pUsers);
客户端代码:
// users * pUsers = (users *)malloc(len);
pUsers = (users *)malloc(2000);
recv(m_socket,(char *)pUsers,sizeof(users),0); // 接收第一个客户地址 if(pUsers->count==1)
return TRUE;
// 接收其它客户地址
recv(m_socket,(char *)(&pUsers->user[1]),pUsers->len-sizeof(users),0);
for( i=0; i<pUsers->count; i++)
{
TRACE("IP[i]=%08X,PORT[i]=%d\n",i,pUsers->user[i].ip,pUsers->user[i].port);
}
(1)发送端将结构体写到char型buffer中;
(2)接收端将接收到的char型buffer数据转化为结构体。
-----------------------------
可以考虑使用tinyXML将结构体数据转化为xml数据,然后再发送,接收端接受到xml数据后,按tinyXML方法解析一下即可得到对应的结构体数据,即写两个函数,一个是用于组xml包的函数,一个是用于解析xml包的函数。