热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CSocket如何接收和发送结构体

1使用CSocket类发送一个结构体数据:CSocketFaSongSocketstructmessage{unsignedinta;unsignedi
1   使用CSocket类发送一个结构体数据:
CSocket FaSongSocket

struct message 
{
unsigned  int a; 
unsigned  int b;
unsigned  int c;
char number[32];
unsigned  int datalen;
char data[100];
} ;
struct message regmsg={1,0,2,{"german"},5,{"hello"}};
    struct message *pregmsg = NULL;
    pregmsg = ®msg;

FaSongSocket.SendTo( pregmsg,sizeof(regmsg),2330,"192.168.1.60");//发送数据
如上面所示 发送数据过程是否正确



2  使用CSocket类接收一个结构体数据:

struct message 
{
unsigned  int a; 
unsigned  int b;
unsigned  int c;
char number[32];
unsigned  int datalen;
char data[100];
} ;

struct message recvmsg;

CSocket m_ReceiveSocket;
char *buff1[256];
m_ReceiveSocket.Receive(buff1,256);
memcpy(&recvmsg,  此处如何写呢, sizeof(recvmsg));
得到buff1后如何分解 得到结构体的内容?
3 另外 发送和接收 结构体是否 
可以 只创建一个 CSocket对象呢,然后使用 Creat函数创建一个端口,用同一个端口 完成发送和接收(我创建了一个接收线程 接收网络数据)?

5 个解决方案

#1


引用楼主 german010 的帖子:
1  使用CSocket类发送一个结构体数据: 
CSocket FaSongSocket 

struct message 

unsigned  int a; 
unsigned  int b; 
unsigned  int c; 
char number[32]; 
unsigned  int datalen; 
char data[100]; 
} ; 
struct message regmsg={1,0,2,{"german"},5,{"hello"}}; 
    struct message *pregmsg = NULL; 
    pregmsg = ®msg; 

FaSongSocket.SendTo( (char*)pregmsg,sizeof(regmsg),2330,"192.168.1.60");将结构体指针强制转换

2  使用CSocket类接收一个结构体数据: 

struct message 

unsigned  int a; 
unsigned  int b; 
unsigned  int c; 
char number[32]; 
unsigned  int datalen; 
char data[100]; 
} ; 


struct message recvmsg; 

CSocket m_ReceiveSocket; 
char *buff1[256]; 
m_ReceiveSocket.Receive(buff1,256); 
memcpy(&recvmsg,  buff1, sizeof(recvmsg)); //

3 另外 发送和接收 结构体是否 
可以 只创建一个 CSocket对象呢,然后使用 Creat函数创建一个端口,用同一个端口 完成发送和接收(我创建了一个接收线程 接收网络数据)? 
可以进行双向通信

#2


CSocket m_ReceiveSocket;
char *buff1[256];
int nRecv = m_ReceiveSocket.Receive(buff1,256);
if(nRecv > 0){
   memcpy(&recvmsg, buff1, nRecv); 
   //...此处要做数据包是否完整的判断,不完整则继续recv后再接在recvmsg后面,直到判断到是一个完整的包为止。

   //如果判断接收到数据包完整,则..
   message *msg = (message*)recvmsg;
 
   //msg中就是你要的数据结构
  
}

实际通讯情况中可能还不是这么简单,应该要对数据包加包头标记、检验位,因为tcp通讯不能保证每次总将一整个struct发到对方,所以要做组包判断逻辑。

#3


针对第3问
发送接收可以使用同一个线程,但效率不高,一般开两个线程,一个收一个发。
再有CSocket是MFC的对象,我一直认为直接使用socket api会更容易控制一些。

#4


我要告诉你的是,通过网络发送或接收结构体,,必须使用字节对齐,否则,,,你可能会接收不到正确的数据

#5


 感谢Crob 回复
平均给分的,为何有的会没有给上呢?

推荐阅读
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 本文探讨了C语言和C++中大小写的处理方式,并详细介绍了如何在C++中实现不区分大小写的字符串比较。通过自定义`char_traits`类,可以灵活地处理字符的比较、复制和转换。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 你的问题在于:1. 代码格式混乱,缺乏必要的缩进,导致可读性极低;2. 使用 `strlen()` 和 `malloc()` 函数时,必须包含相应的头文件;3. `write()` 函数的返回值处理不当,建议检查并处理其返回值以确保程序的健壮性。此外,建议在编写代码时遵循良好的编程规范,增加代码的可维护性和可读性。 ... [详细]
  • 在深入探讨进程间通信技术时,本文重点解析了描述符传递的方法。通过详细分析发送和接收描述符的过程,文章首先介绍了发送描述符的具体步骤,并提供了相关函数原型。此外,还讨论了如何高效地在不同进程之间传输文件描述符,以实现资源的共享和同步。这一技术在多进程应用中具有重要意义,能够显著提升系统的性能和可靠性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
author-avatar
广东蒗缦m莎
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有