问题描述
- winsocket里怎么发送自己定义的消息体
-
消息的结构体:msgType为消息类型,msgContent为消息的内容
struct MSGStruct
{
unsigned char msgType;
const char * msgContent;
};发送消息:send(so, (const char *)msg, sizeof(msg)+strlen(msg->msgContent), 0);将MSGStruct指针转为const char *指针
接受消息:
char recvBuf[100] = "";
int length = recv(so, recvBuf, 100, 0);
MSGStruct * msg = (MSGStruct*)recvBuf;
将读到的recvBuf转为msg,有时会出错,不知应该怎么改,求大家帮帮忙~~
解决方案
首先要看接受到的数据是你结构体格式,其次用memcpy来复制数据。
解决方案二:
char * MySocket::MsgToChar(MSGStruct * msg)
{
char * c = new char[100];
memcpy(c, msg, sizeof(MSGStruct));
return c;
}
MSGStruct * MySocket::CharToMsg(char * c)
{
MSGStruct * msg = new MSGStruct();
memcpy(msg, c, sizeof(MSGStruct));
return msg;
}
send发送的时候把消息结构体转为char *:send(so, this->MsgToChar(msg), 100, 0);
接收的时候把char * 转为消息结构体:MSGStruct * msg = this->CharToMsg(recvBuf);
当msg->msgContent指向常字符串时不会出错,指向非 常字符串时就报错了,说无法读取字符串......头痛啊,不知什么原因。。
解决方案三:
已经测试过,在没把消息结构体send出去之前的转换是没有问题的,send出去,然后recv后的字符串再转MSGStruct*就会读取字符串出错,这里不知道应如何处理。。。哎~~
解决方案四:
结构体对齐是否一致
我以前也你这样用过 直接发送结构体 接收再转回结构体 没感觉出问题啊
解决方案五:
不用结构体,自己定义包头包体,接收方拆包。
解决方案六:
接收消息时没有保证发送的和接收的数据所占大小一致