我也有这个问题啊,我在客户端传递的时候send的第一个参数是结构体的地址,第二个参数是结构体的大小,发送到服务器端的时候我用一个比较大的char数组接受,接受以后想强制转换为原始结构体,但是它总是说把一个char指针转换为struct指针啊,这是怎么回事? 我的代码是: typedef struct data DATA 客户端: DATA datatoSend; pSocket-》Send(LPCSTR(&datatoSend),sizeof(DATA)) 服务器端是 DATA dataReceived; char Msg[20]; ...//存放接受数据过程 &dataReceived = (DATA)Msg; 请问这个是什么原因啊?急啊
&dataReceived = (DATA)Msg; 你这个肯定错了啊,应该是 DATA *datatoSend = (DATA *)Msg;
我的代码是:
typedef struct data DATA
客户端:
DATA datatoSend;
pSocket-》Send(LPCSTR(&datatoSend),sizeof(DATA))
服务器端是
DATA dataReceived;
char Msg[20];
...//存放接受数据过程
&dataReceived = (DATA)Msg;
请问这个是什么原因啊?急啊
你这个肯定错了啊,应该是
DATA *datatoSend = (DATA *)Msg;
改成这样也可以:
memcpy(&dataReceived, Msg, sizeof(DATA));
有关数据结构的问题,基本都可以用结构体解决
传输时用char*强制转换
接收的时候,可以定义好结构体,再recv(socket,&Data,sizeof(Data))
申请一块足够大的内存来接收,存放这些数据,然后分析,处理。
char* buf = (char*)malloc(SOCKET_RECV_MAXSIZE+1);
....//判断是否申请成功
numbyte=recv(cli_fd, buf, SOCKET_RECV_MAXSIZE, 0);
...
....
最后别忘记free掉那块内存。
if( NULL!=buf )
{
free(buf);
buf=NULL;
}//------------------------------
其实更好的方法是你定义一个消息传递的消息。比如:
typedef struct message_hdr{
unsigned short msg_type; //消息类型
unsigned short cmd_type; //命令类型
unsigned short optional_cmds; //扩展类型
unsigned short chksum; //Chksum校验
unsigned long data_len; //数据长度
unsigned long retcode; //描述信息代码
}MSG_HDR;
发送数据前,先发送消息,这样,接收端根据消息类型和命令类型来判断执行什么动作,根据数据长度来确定接收数据的大小。