如何用recv()接收不同的结构体 我使用的是winsock2.0,做法是让服务器端accept到客户端的connect后就创建一个线程,然后在线程中recv客户端send过来的消息,我想让这个线程能第一次接收到一种结构体,做相应的操作;然后第二次接收的是另一种结构体,做另一种操作,应该怎么做。请高手指教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 但是要注意,不能在结构体中包含CString等可以变长的数据类型。 typedef struct Yuan{int color;int x;int y;int r;}YUAN;YUAN yuan1;yuan1.color=1;yuan1.x=m_x;yuan1.y=m_y;yuan1.r=m_r;YUAN *p;p=&yuan1;CSocket m_hSocket;m_hSocket.Create(2330,SOCK_DGRAM);m_hSocket.SendTo( p,sizeof(yuan1),3550,"127.0.0.1");//用结构体发送。接收:void CSocket::OnReceive(int nErrorCode) { char buff[256]; int ret=0; ret=Receive(buff,256); if(ret==ERROR) { TRACE("ERROR!"); } else { YUAN *p=(YUAN *)buff; //还原为结构体类型 int a=p->x; //分别取值 int b=p->y; int c=p->r; int colors=p->color; } CSocket::OnReceive(nErrorCode);} 我是要传两种不同的结构体。不知道服务器端应该怎么编程来分辨它们的信息。struct fileinfo{ int fileno; int type; long len; int seek; char name[100];}; fileinfo fileinfo1; fileinfo1.len=filerange[index*2+1 fileinfo1.seek=filerange[index*2]; fileinfo1.type=2; fileinfo1.fileno=doinfo.threadno; connect(m_socket,(LPSOCKADDR)&local,sizeof(local)); sendn(m_socket,(char*)&fileinfo1,100); struct filesendinfo { char name[100]; int length; int date; }; filesendinfo zmfile[10]; connect(m_socket,(LPSOCKADDR)&local,sizeof(local)); sendn(m_socket,(char*)zmfile,1080);服务器端在accept()后应该怎么做才能分辨出send过来的是fileinfo结构还是filesendinfo。请大家帮忙。 你在结构体中加一个标识字段不就可以了,或者你定义一个虚基类,两个结构体都是派生的,要有一个虚函数,例如getClassName();class base{public: char ClassName; virtual char getClassName()const;};class Drive1:public base{ getClassName(){return 1;}}class Drive2:public base{ getClassName(){return 2;}}最好的方法还是在结构中定义字段 但结构体的大小不同的,sendn的最后一个参数应该怎么设置呢? ddgfei(不懂规矩) 说在结构体里定义一个标识字段,但因为两种结构体的大小是不同的,所以send()函数的最后一个参数即结构体的大小应该怎么设置呢? 如果使用强制转换,你就必须将结构体的字节编排好。例如两个结构体struct 1{ char bianhao; char name; char neirong[100];}struct 2{ char bianhao; char dabian[1000];}哈哈…………说的狗清楚了吗? 如果使用类的方法,必须对这些字符段实行interpret_cast<>方法。看你对C++和C的熟悉程度。 你可以定义一个结构体,在这个结构体中包含你要传输的所有不同结构体的变量。然后在结构体中设置一个整型变量来区分不同的信息类型。当接收到一个结构体时,先读取他的整型变量,然后再执行相应的操作如:typedef struct temp { BYTE flag; char name[15]; char password[12]; char Message[180]; bool success; //temp* Next; }Msg;收到消息时: Msg msg1; buffer[nLen]=NULL; memcpy((void*)&m_msg,buffer,nLen); switch(m_msg.flag) { case 0: {//登陆信息 msg1 = LandResult(); //if(m_ServerSocket.m_pHead->m_pNext) SendToClient(m_ServerSocket.m_pHead,msg1); } break; case 1: SendToClient(m_ServerSocket.m_pHead,m_msg); break;// case 2: SendToClient(m_ServerSocket.m_pHead,m_msg);// break; case 3: SendToClient(m_ServerSocket.m_pHead,m_msg); break; default: break; } 没有合适的默认构造函数可用,这个错误是怎么造成的? 界面编程问题,在线等 window系统目录下system和system32都有什么作用? 這個程式copy txt文件沒有問題,但是copy exe文件有問題,為什麼呢? 如何改CTabCtrl的背景色 关于内存分配,高分相送。 是高手就请进来看一下!!!!给100分 c中如何实现可选参数 线程结束出现问题??? vs 2008 int to unsigned char *数组 请问,无线网卡和有线的网卡连接到internet,进行网络编程有区别么?有什么区别? xml解析问题
int color;
int x;
int y;
int r;
}YUAN;
YUAN yuan1;
yuan1.color=1;
yuan1.x=m_x;
yuan1.y=m_y;
yuan1.r=m_r;YUAN *p;
p=&yuan1;
CSocket m_hSocket;
m_hSocket.Create(2330,SOCK_DGRAM);
m_hSocket.SendTo( p,sizeof(yuan1),3550,"127.0.0.1");//用结构体发送。
接收:void CSocket::OnReceive(int nErrorCode)
{
char buff[256];
int ret=0;
ret=Receive(buff,256);
if(ret==ERROR)
{
TRACE("ERROR!");
}
else
{
YUAN *p=(YUAN *)buff; //还原为结构体类型
int a=p->x; //分别取值
int b=p->y;
int c=p->r;
int colors=p->color;
}
CSocket::OnReceive(nErrorCode);
}
struct fileinfo
{
int fileno;
int type;
long len;
int seek;
char name[100];
};
fileinfo fileinfo1;
fileinfo1.len=filerange[index*2+1
fileinfo1.seek=filerange[index*2];
fileinfo1.type=2;
fileinfo1.fileno=doinfo.threadno;
connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
sendn(m_socket,(char*)&fileinfo1,100); struct filesendinfo
{
char name[100];
int length;
int date;
};
filesendinfo zmfile[10];
connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
sendn(m_socket,(char*)zmfile,1080);
服务器端在accept()后应该怎么做才能分辨出send过来的是fileinfo结构还是filesendinfo。请大家帮忙。
或者你定义一个虚基类,两个结构体都是派生的,要有一个虚函数,例如getClassName();
class base{
public:
char ClassName;
virtual char getClassName()const;
};class Drive1:public base
{
getClassName(){return 1;}
}class Drive2:public base
{
getClassName(){return 2;}
}最好的方法还是在结构中定义字段
struct 1{
char bianhao;
char name;
char neirong[100];
}struct 2{
char bianhao;
char dabian[1000];
}
哈哈…………说的狗清楚了吗?
BYTE flag;
char name[15];
char password[12];
char Message[180];
bool success;
//temp* Next;
}Msg;收到消息时:
Msg msg1;
buffer[nLen]=NULL;
memcpy((void*)&m_msg,buffer,nLen);
switch(m_msg.flag)
{
case 0: {//登陆信息
msg1 = LandResult();
//if(m_ServerSocket.m_pHead->m_pNext)
SendToClient(m_ServerSocket.m_pHead,msg1);
}
break;
case 1: SendToClient(m_ServerSocket.m_pHead,m_msg);
break;
// case 2: SendToClient(m_ServerSocket.m_pHead,m_msg);
// break;
case 3: SendToClient(m_ServerSocket.m_pHead,m_msg);
break;
default:
break;
}