windows-winsocket里怎么发送自己定义的消息体

问题描述

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*就会读取字符串出错,这里不知道应如何处理。。。哎~~

解决方案四:

结构体对齐是否一致
我以前也你这样用过 直接发送结构体 接收再转回结构体 没感觉出问题啊

解决方案五:

不用结构体,自己定义包头包体,接收方拆包。

解决方案六:

接收消息时没有保证发送的和接收的数据所占大小一致

时间: 2024-11-03 22:30:05

windows-winsocket里怎么发送自己定义的消息体的相关文章

windows azure 里面的ftp怎么发布到公网上???

问题描述 windows azure 里面的ftp怎么发布到公网上??? windows azure 里面的ftp怎么发布到公网上??? 解决方案 在默认的配置下,安装好iis和ftp,打开防火墙允许21端口,以及在azure的门户中endpoint那里添加21端口,tcp协议,即可. 解决方案二: 这个主要是在你的azure的管理页面中打开机器对应端口的访问权限,开放给外网机器访问. 解决方案三: Hi 如果您是想在Azure虚拟机中配置可供外网访问的ftp服务器的话,我们首先需要安装iis和

class-在VC#里,接口不能定义属性么?只有抽象类才能定义属性?

问题描述 在VC#里,接口不能定义属性么?只有抽象类才能定义属性? interface MyInterface { public int XueHao { get; set; } } 解决方案 也可以,但是要去掉public interface MyInterface { int XueHao { get; set; } } 解决方案二: JAVA接口中的属性定义 解决方案三: 接口可以定义属性,但是接口中的方法和属性不能有访问权限修饰符,所以你应该去掉public

getdc-为什么我的vs2010里的win32未定义GetDC()函数

问题描述 为什么我的vs2010里的win32未定义GetDC()函数 解决方案 要看你的头文件,你怎么调用的,怎么定义的.你代码都看不着.

应用- windows azure里的SSAS

问题描述 windows azure里的SSAS windows azure里的SSAS我们计划移动现有的SSAS应用到云中,现在有几个问题:VM图像必须在windows serve 2008R2,Hyper-V中产生吗?我们能从azure中直接得到VM从而设置SSAS应用吗? 解决方案 你好,Azure 自带的images 里面也有SQL server 的呀.可以直接在Azure 上创建虚拟机来设置SSAS.你可参考以下文档:SQL Server Business Intelligence i

备份-求大神告诉我为什么我下面这个批处理复制时唯独windows目录里的文件拷贝不出来 试过右键管理员

问题描述 求大神告诉我为什么我下面这个批处理复制时唯独windows目录里的文件拷贝不出来 试过右键管理员 echo off set /p zf= 输入字符(如 .txt;a.txt;???s.*): set /p lj= 设置你要备份的路径(如 c:): md %lj% for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (for /f "tokens=*" %%i in ('dir /a-d /b

怎么把java日志写到windows系统日志里啊?还有怎么生成一vbs了

问题描述 怎么把java日志写到windows系统日志里啊?还有怎么生成一vbs了 解决方案 解决方案二:这样有什么好处呢

如何把一个头文件中定义的结构体用到另一个头文件中,另一个头文件中定义的结构体又用到改头文件中?

问题描述 如何把一个头文件中定义的结构体用到另一个头文件中,另一个头文件中定义的结构体又用到改头文件中? //栈的头文件声明 #include #include #include "Tree" #ifndef STACK_H #define STACK_H typedef union typelemt{ char ch; Tree t; }typelemt; typedef struct stack{ typelemt* type_stack; int max; }stack; typ

详解C++程序中定义struct结构体的方法_C 语言

什么是结构体?简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 结构体的定义 定义结构体使用struct修饰符,例如: struct

C语言 socket 如何发送带指针的结构体?

问题描述 C语言 socket 如何发送带指针的结构体? 发送一个带指针的结构体,我知道怎么发送? 先把结构体转换成字符串,然后发出.但是接收的时候,怎么接收到结构体中?thanks! 解决方案 发送: struct f;char *ffff[sizeof(f)];memcpy(ffff &f sizeof(f)); 接收: struct f; ffff为收到的数据 memcpy(&f ffff sizeof(ffff)); 解决方案二: C语言---结构体指针C语言--结构体中的指针C语