C#与C++通过socket传送结构体】的更多相关文章

C#服务端: using System; using System.Net.Sockets; using System.Net; using System.IO; using System.Diagnostics; using System.Threading; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, Pack = )] public struct PaketHead { public…
这个问题在其他博客中已经给出了解决方案,这里结合自己的Demo说一下. 函数调用的库文件是基于TCP协议的封装,在传送消息体的时候,发送消息结果大体如下: XXXXPost(srcid, EVENT,(void *) Massage, sizeof( Massage), ......); //类似于socket变成中的send()函数 由于TCP协议发送信息采用流传递,显然,需要讲结构体转换为字符串流.下面是我的用法: 发送端: TMsg T_msg_accept;//TMsg 是结构体 str…
struct send_info {char info_from[20]; //发送者IDchar info_to[20]; //接收者IDint info_length; //发送的消息主体的长度char info_content[1024]; //消息主体}; 发送端主要代码(为了简洁说明问题,我把用户输入的内容.长度等验证的代码去掉了): struct send_info info1; //定义结构体变量printf("This is client,please input message…
今天我们来学 socket  发送结构体 1. 先看要发送的结构体 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Lin.p2p.Mo {     /// <summary>     /// 通信消息格式     /// </summary>     [Serializable]     [Struc…
利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.cnblogs.com/xudong-bupt/p/3496741.html 1.memcpy Copy block of memory.内存块拷贝函数,该函数是标准库函数,可以进行二进制拷贝数据. 函数原型: void * memcpy ( void * destination, const voi…
一.两种通用socket结构体 1. sockaddr struct sockaddr { sa_family_t sa_family; // 地址族 char sa_data[14]; // 存放socket地址值 }; 补:由于不同的协议栈的地址值具有不同的含义和长度(如PF_INET6的地址值占用26字节,更不必说PF_UNIX的地址值最大可达到108字节),所以14字节的sa_data根本无法容纳多数协议族的地址值. 2. sockaddr_storage struct sockaddr…
1.结构体 存放多个不同类型的数据 但是是相关联的 数组 存放多个相同类型的数据 结构体是存放多个相关联的不同类型的数组 struct 定义一个结构体类型 自定义类型 2.结构体定义方式 定义类型最通用的方式: struct student ///student是自己取得名字 结构体定义的时候也可以初始化3.定义结构体类型的变量 //开始使用4.运算符 点运算符(成员运算符) . 定义的时候初始化 指针 箭头运算符 -> (只能用于结构体指针) 其他结构类型可以包含任何已经定义好的类型给名字比较…
转自:http://developer.51cto.com/art/200908/143779.htm 解决C#结构体数组间的转化问题的由来:在写C#TCP通信程序时,发送数据时,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现: (1)解决C#结构体数组间的转化之定义结构体: //命名空间 using System.Runtime.…
另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字节流.因为结构体本身也是内存中的一块连续数据.问题就变成了如何把结构体手动转成字节的问题了采用类似的报头: // packet head typedef struct tagPacketHead{ long PacketID; long PacketLen;} PacketHead;此时套接口的读写…
最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象.也就是在C#端的Receive().这个函数返回的是多个结构体连起来的数据,这当然是无法解析的.我的解决方案如下: List<byte[]> listb = new List<byte[]>(); .......... int recv = newclient.Receive(b1); for (int x = 0;…
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转换的空间必须与源空间一一对应. 而结构体则是由不固定的多种类型变量组合而成, 因此强制转换时并不确定原格式与目标格式确定的对应关系, 例如一个结构体为3个变量, 而另一个则为2个, 那么就无法确定如何分配. 因此最简单的让计算机可以理解的方式就是先将结构体转换成指针, 然后将指针转换成目标格式, 再…
最近在用C#做一个项目的时候,Socket发送消息的时候遇到了服务端需要接收C++结构体的二进制数据流,这个时候就需要用C#仿照C++的结 构体做出一个结构来,然后将其转换成二进制流进行发送,之后将响应消息的二进制数据流转换成C#结构. 1.仿照C++结构体写出C#的结构来    1  using  System.Runtime.InteropServices;  2    3      [Serializable]  //  指示可序列化   4      [StructLayout(Layo…
sockaddr结构体 sockaddr的缺陷: struct sockaddr 是一个通用地址结构,这是为了统一地址结构的表示方法,统一接口函数,使不同的地址结构可以被bind() , connect() 等函数调用:sa_data把目标地址和端口信息混在一起了 struct sockaddr {       unsigned short sa_family; char sa_data[14];                   };  sa_family是通信类型,最常用的值是 "AF_I…
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://weiguozhihui.blog.51cto.com/3060615/1585297 在内核中为什么要有struct socket结构体呢?    struct socket结构体的作用是什么?    下面这个图,我觉得可以回答以上两个问题.       由这个图可知,内核中的进程可以通过使用struct socket结构体来访问linux内核中的网络系统中的传输层.网络层.数…
proto socket 关联结构: { .type = SOCK_STREAM, .protocol = IPPROTO_TCP, .prot = &tcp_prot, .ops = &inet_stream_ops, .flags = INET_PROTOSW_PERMANENT | INET_PROTOSW_ICSK, }, { .type = SOCK_DGRAM, .protocol = IPPROTO_UDP, .prot = &udp_prot, .ops = &am…
直接发送和接收结构体,例如:struct A {...};struct A objectA; 发送的时候: tcpSocket->write((char *)&objectA, sizeof(objectA));  接收的时候:struct A objectB;tcpSocket->read((char *)&objectA, sizeof(objectA)); http://blog.csdn.net/emdfans/article/details/23869325…
结构体的一些相关知识 可直接转换类类型,比如int类型,在托管代码和非托管代码中占据内存大小 和意义都是一个样的. 结构体封送的关键是:在托管代码和非托管代码中定义的一致性.什么是定义的一致性?包括结构体的对齐粒度:结构体成员的顺序和每个结构体成员在托管代码和非托管代码中的占据内存的大小.本来想着是只是类型一样就行了,但是像布尔类型,在托管代码中占据1个字节,但是在非托管代码中是4个字节,也就是非可直接转换类型. 对齐粒度.这个东西感觉和内存布局有关,以前有一个错误的理念:在一个结构体中定义了一…
struct sockaddr { unsigned  short  sa_family;     /* address family, AF_xxx */char  sa_data[14];                 /* 14 bytes of protocol address */};sa_family是地址家族,一般都是“AF_xxx”的形式.好像通常大多用的是都是AF_INET.sa_data是14字节协议地址.此数据结构用做bind.connect.recvfrom.sendt…
内核中用于数据接收的结构体struct msghdr(转) 我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用sendto发送这个icmp包. ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);…
工作中遇到 else if( (s_buf.st_mode&S_IFMT) == S_IFDIR) return 2; else if( !(s_buf.st_mode&S_IFREG) || access(file, W_OK) == -1) return 0: return 1;     来了解一下stat结构体 sturct stat 结构体中 st_mode 的含义 2013-03-15 22:02 4346人阅读 评论(5) 收藏 举报  分类: 系统编程(17)  在<s…
用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助理解的方法,在描述中可能会有一些地方与真实定义有所出入,仅供参考. 首先先认识一下ifconf和ifreq: //ifconf通常是用来保存所有接口信息的 //if.h struct ifconf { int ifc_len; /* size of buffer */ union { char *ifcu_buf; /* input from…
总结一下,今天学习的关于通过socket,ioctl来获得ip,netmask等信息,其中很多内容参照了很多网上的信息,我会一一列出的 我用的这个函数,就是下面这个函数,其中的有一些全局变量,很好懂,也就不多做解释了一.下面对这个函数进行注解一下: int get_nic_IP_Address()//获取各网卡IP地址.子网掩码{ struct ifreq ifreq;  //声明一个struct ifreq结构体(这个结构体中有很多重要的参数,具体可以参照第二的补充)   int sock; …
C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响. 例子: typedef struct tagSTUDENT{ char name[20]; int age; }STUDENT; void fun(STUDENT stu) { printf("stu.name=%s,stu.age=%d/…
最近又遇到了几年前遇到的问题,标记一下. 对于跨字节位域(bit field)而言,如果数据传输前后环境的字节序不同(LE->BE,BE->LE),简单地调用(ntohs/ntohl/htons/htonl)并不能正确读取位域的值. 例如: struct _exam_ { unsigned ; unsigned ; unsigned ; unsigned ; unsigned ; }Exam; 其中,tag,field2,pad是字节内位域,field1和field3是跨字节位域.当这个结构体…
因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数据类型的对应,还有结构体的封装使用.在夸语言调用方面,Java和C#都只能调用C格式导出的动态库,因为C数据类型比较单一,容易映射,两者都是在本地端提供一套与之映射的C#或者Java的描述接口,通过底层处理这种映射关系达到调用的目的. 一. 结构体的传递 #define JNAAPI extern…
联合体用途:使几个不同类型的变量共占一段内存(相互覆盖) 结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型 总结: 声明一个联合体: union abc { int i; char m; }; 1. 在联合体abc中,整型量i和字符m公用同一内存位置. 2. 当一个联合被说明时,编译程序自动地产生一个变量,其长度为联合中最大的变量长度. ============================================================…
源:TCP/IP协议头部结构体(网摘小结) TCP/IP协议头部结构体(转) 网络协议结构体定义 // i386 is little_endian. #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN (1) //BYTE ORDER #else #error Redefine LITTLE_ORDER #endif //Mac头部,总长度14字节 typedef struct _eth_hdr { unsigned ]; //目标mac地址 unsigned…
最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给游戏服务器,响应消息再交由python进行校验; 开始: 首先是c++调用python这一层需要打通; 幸运的是python自己有一套库提供c/c++进行调用; 下面我贴代码;用的vs2013,python用的2.7 // python_c++.cpp : 定义控制台应用程序的入口点. // #in…
上一篇文章讲解了带位域的结构体,在从大端机(Big Endian)传输到小端机(Little Endian)后如何解析位域值.下面继续深入详解字节序,以及位域存储的方式. (1) 我们知道,存储数字时,对小端机而言,数字的低位,存在低地址,高位存在高地址.大端机正相反. (2) 读取的方式,也是一样的.对于小端机,读出的低地址位作为数字的低位. (3) 此外Big-Endian/Little-Endian存储顺序,不仅仅针对字节,还针对字节内的比特位.对于小端机而言,字节内的8个比特,低地址端比…
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要. 首先是结构体定义,一些基本的数据类型,C#与C++都是可以匹配的: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = )] public struct Head { public u…