socket将结构体转换为字符串 传输问题

socket通信像结构体中嵌套结构体时,收到的数据错误,谁遇到过?求大神们指导

传输的结构如下:
struct CatchFish {
int fish_id;
int fish_kind;
SCORE fish_score;
bool bullet_double;
int link_fish_id;
bool bullet_invincible;
bool sepcial_sence;
int special_fish_kind_;
DWORD special_start_fish_id;
};

struct CMD_S_CatchFishGroup {
DWORD tick_count;
WORD chair_id;
int fish_count;
CatchFish catch_fish[kMaxCatchFishCount_FishLK2];
int bullet_id;
};
像这样的数据,在catch_fish的第一个数据fish_id是对的,其他的大部分是错误的?这是什么原因造成的?

2个回答

先看你收到的数据是否正确,然后就是你截取,读取缓冲区数据的时候,对应的类型等是否映射对。

什么叫结构体转换为字符串?结构体的数据是二进制的,转换为字符串数据会被破坏,必须以二进制数组的方式传输。如果目标计算机使用的编译器/机器架构不同,还要注意对齐和字节序的问题。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
无法将一个结构体转换为字符串。。。
各位大大问个问题:我想把结构体转换为字符串,rn网上给了一个这个答案:struct messagernrnPOINT point;rnint state;rn;rnstruct message msg; rnchar msg_buf[100]; rn然后 memcpy(msg_buf,&msg,sizeof(message)); //将结构体转换为字符串rn但是我在vc6.0下,观察变量,msg_buf只能接受&msg中的第一个信息,并不能完全得到它的值,我不知道原因是什么,搞了好久了,网上都说可以这样转换,但是我的得不到结果 rn
socket传输结构体,或者结构体转换成字符串
我用SNMP的API获取了信息,现在想用socket传输到服务器端。rn但结构体好像不能直接传输,但又没办转换成字符串。rn求大神指点一下,该怎么办。rn下面是部分代码rn[code=c]//查询结果rn char *string = NULL;rn SnmpMgrOidToStr(&variableBindings.list[0].name, &string);rn printf("Variable = %s\n", string);rn rn //发送查询结果 rn ret = send (sClient, (char *)&string, sizeof(string), 0);rn if (string) SNMP_free(string);rn if (ret == SOCKET_ERROR)rn rn printf("send() failed!\n");rn rn elsern printf("client info has been sent!");rnrn //转换成字符串 rn char str[255];rn sprintf(str, "%s",&variableBindings.list[0].value);rn rn //发送rn ret = send (sClient, (char *)&str, sizeof(str), 0);rn if (ret == SOCKET_ERROR)rn rn printf("send() failed!\n");rn rn elsern printf("client info has been sent!");rn printf("\n");[/code]
socket传输结构体的问题
我的代码想完成把服务器端当前目录传送到客户端的功能。rn使用socket传输目录结构体。rn思路是将结构体中的内容放入buf-->send传输-->recv接收-->buf数据放入目录结构体。rnrn目录结构体定义(ANSI定义)rn[code=C/C++]struct dirent rnino_t d_ino; /* 索引号 */rnoff_t d_off; /* 下一个偏移量 */rnunsigned short d_reclen; /* 本记录长度 */rnunsigned char d_type; /* 文件类型 */rnchar d_name[256]; /* 文件名 */rn;[/code]rnrn服务器端主要代码rn[code=C/C++]DIR *dir;rn struct dirent *ptr;rn char dirbuf[sizeof(*ptr)];rn if((dir = opendir("./")) == NULL) rn perror("opendir\n");rn exit(1);rn rn while((ptr = readdir(dir)) != NULL) rn memcpy(dirbuf, &ptr, sizeof(*ptr)); rn if((sendBytes = send(clientfd, dirbuf, sizeof(dirbuf), 0)) == -1) rn perror("fail to send dir");rn exit(1); rn rn printf("name:%s\n", ptr->d_name);rn rn closedir(dir);rn[/code]rnrn客户端主要代码rn[code=C/C++] struct dirent *ptr;rn char dirbuf[sizeof(*ptr)];rn printf("current dir on server:\n");rn memset(dirbuf, 0x00, sizeof(dirbuf));rn while(recvBytes = recv(sockfd, dirbuf, sizeof(dirbuf), 0)) rn if(recvBytes == -1) rn printf("faile to receive dir");rn exit(1);rn rn memcpy(&ptr, dirbuf, sizeof(*ptr));rn printf("%s\n", ptr->d_name);rn rn[/code]rnrngdb调试客户端,运行到最后一个打印语句时收到“SIGSEGV“发生Segmentation fault.rn请问这是怎么回事呢?rn我该过dirbuf的大小依然不能正常传输。rnrn网上大多数传输结构体的文章都是struct mydata data形式rn是不是struct dirent *ptr比较特殊呢?
将结构体转换为VARIANT
假设有一个结构体 rn strcut Arnrnint nLen;rnchar name[12];rnlong lsize;rn;rnrn如何将A赋值给VARIANT呢?rnrn得到VARIANT以后如何转换回来呢??就是逆操作~
如何将结构体转换为字符串?
结构体定义如下:rnstruct Personrnrn char name[20];rn int age;rn;rnrnstruct Studentrnrn int num;rn struct Person pers;rn;rn我声明一个结构体变量struct Student stud;rn然后对stud的各个成员赋值,例如:rnstud.num = 101;rnmemcpy(stud.pers.name,"seal",sizeof("seal"));rnstud.pers.age = 20;rn接下来就要将这个结构体转换为字符串,rnmemcpy(str,&stud,sizeof(stud));rn结果不对。求大神解答。
求助结构体SOCKET传输问题
struct TEST2 rn rnint D; rn; rnstruct TEST1 rn rnint C; rnTEST2 test2; rn; rnstruct TEST rn rnint A; rnint B; rnTEST1 test1; rn; rnCLINT端: rnTEST test; rntest.A=55; rntest.B=44; rntest.test1.C=20; rntest.test1.test2.D=30; rnchar szSend[1024]; rnmemcpy(szSend,(char*)&test,sizeof(test)); rnsend(m_client.m_hSocket,szSend,strlen(szSend),0); rnSERVER端: rnTEST test; rnmemset(&test,0,sizeof(test)); rnlen=recv(client,(char*)&test,sizeof(test),0); rn szStr=""; rnCString str1; rnstr1.Format("%d",test.A); rnszStr+=str1; rnszStr+=" "; rnstr1.Format("%d",test.B); rnszStr+=str1; rnszStr+=" "; rnstr1.Format("%d",test.test1.C); rnszStr+=str1; rnszStr+=" "; rnstr1.Format("%d",test.test1.test2.D); rnszStr+=str1; rn AfxMessageBox(szStr); rn结果为 55 0 0 0 rn
将数组转换为字符串
String 方法 package com.test; public class Test4lianjie { /**将数组 arr[] = {1,2,3}以[1, 2, 3]的格式输出 * * @param args */ public static void main(String[] args) { int[] arr = {1,2,3}; String s =...
socket实现结构体传输
如题,用CSocket类就能实现吗?
socket 封包传输结构体
本人在利用socket 封包传输数据内容的时候,包头为一结构体,接收方能正常接收包头,如果包体只是为数据内容而非结构体的时候,接收方也能正常接收该数据内容.rn但是当包体为一结构体的时候,接收方不能正常接收包体内容.相关代码如下:rn希望那位老大能帮帮小弟,谢谢rnrn#define HEADERLEN sizeof(DataHeader) //包头长度rnrn//包头rntypedef struct headerrnrn u_short usType; //数据类型rn u_short usLen; //数据长度rnDataHeader,*PDataHeader;rnrntypedef struct _SERVER_MSGrnrn char ser_Name[1024];rn char ser_Version[1024];rnServer_Msg,*PServer_Msg;rnrnServer_Msg serMsg;rnBOOL SendPacket(PDataHeader pDHeader,char *pSendData); //发送数据包rnrnrnCString computername,systemversion;rnrn......rnrnmemcpy(serMsg.ser_Name,computername.GetBuffer(computername.GetLength()),computername.GetLength());rnmemcpy(serMsg.ser_Version,systemversion.GetBuffer(systemversion.GetLength()),systemversion.GetLength());rnrnDataHeader dhr;rn//定义包头内容rndhr.usType=SERVER_MESSAGE;rndhr.usLen=sizeof(serMsg);rnrnSendPacket(&dhr,(char*)&serMsg);rnrn//发送数据包函数rnBOOL SendPacket(PDataHeader pDHeader,char *pSendData)rn rn int nRet;rn char m_Buf[BUFFER_SIZE]; //缓冲区rnrn ZeroMemory(m_Buf,BUFFER_SIZE); //清除缓冲区rn rn //包头rn memcpy(m_Buf,(char*)pDHeader,HEADERLEN); //拷贝包头rn rn //包体rn //拷贝数据rn if (pSendData!=NULL)rn rn int nSendDataLen;rn nSendDataLen=strlen(pSendData); rn memcpy(m_Buf+HEADERLEN,pSendData,nSendDataLen); //数据rn rn rn //发送数据rn nRet=send(tcsocket,m_Buf,HEADERLEN+pDHeader->usLen,0);rn if (nRet==SOCKET_ERROR)rn rn MessageBox(NULL,"SendPacket发送数据包失败","",MB_OK);rn return FALSE;rn rn return TRUE;rnrnrn麻烦各位老大指导指导小弟了
C++ socket传输结构体
struct Test { char ip[30]; char name[30]; }; Test te; char buff[1024]; memset(buff, 0, 1024); memset(&te, 0x00, sizeof(Test)); //直接接收结构体 recv(serConn, (char*)(&te), sizeof(Test), NU
socket传输结构体的解决办法
socket传输结构体的解决办法,一般的socket只能传输字符串,怎么解决这个问题呢?看看这个吧
将TOML转换为Go结构体TOML-To-Go.zip
TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。通过 toml-to-go 提供的 Web UI,可以方便的将 TOML 转换成 Golang 结构体。在左侧粘贴 TOML 文件内容即可得到对应的 Struct,接下来可以将得到的结构体使用到你的 Golang 项目中。界面截图 标签:TOMLToGo
C++将结构体转换为char数组
结构体定义如下rnstruct msg_typernrn char type[10];rn char content[1024];rn;rnrn小弟试过这样转换:rnmsg_type sendbuf;rnmemset(sendbuf.content,0,sizeof(sendbuf.content));rnmemset(sendbuf.type,0,sizeof(sendbuf.type));rnmemcpy( sendbuf.type,"add", sizeof("add") );rnmemcpy( sendbuf.content,"content", sizeof("content") );rnint len=sizeof(sendbuf);rnchar snd_buf[1024];rnmemset(snd_buf,0,sizeof(snd_buf));rnmemcpy(snd_buf,&sendbuf,len);rnrn但是结果snd_buf中只有sendbuf中type的内容,没有content的内容,求各位大神解答
结构体转换为cstring
[code=C/C++]typedef struct LNode rnrn int data;rn struct LNode *next; rn [/code]定义了一个这样的结构体LinkList *p。rn想将p->data在edit控件中输出,比如m_edit1。应该怎样实现啊?谢谢大家……
Socket传输结构体数据注意事项
【1 背景】 在Socket通信中,要传输结构化的数据或者要进行协议数据传输的时候,发送端必须要构造结构体进行数据传输。 接收端也必须通过同样的结构体进行解析。 但Socket传输结构体数据时候,稍有不慎就会出现:1)解析数据出错;2)接收数据不完整;3)解析为乱码等的Bug。 【2 举例】 如下是接收端解析数据为乱码甚至崩溃的一类常见错误。
如何用socket传输结构体
请问如何利用C#中的Soket来传输结构体,急急急·请高手指点
socket传输结构体,成员变量封装格式?
socket传输结构体时,要将结构体转化为字节流,请问转化后的格式具体是什么样的呢?接收端接收到结构的字节流怎么区分结构体的各成员变量?接收端与发送端的结构体成员顺序是否一定要一致?想弄明白,感谢回答。
Linux C socket传输结构体
服务器端: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<sys/types.h> 5 #include<sys/socket.h> 6 #include<netinet/in.h> 7 #include<arpa/inet.h> 8 9 10 11 #def
Socket中结构体数据的传输
我服务端和客服端是这样在类外定义的rntypedef struct Datarnrn //int order;rn CString filedata[4][100];rnDataPacket;rn服务端:rnint sended;rn for (int j=0;j<5;j++)rn rn MessageBox(ThreadData.filedata[0][j]);rn rn for(int i=1;i<=csnum;i++) if(csrev[i]) rn if( sended=csrev[i].Send((char*)&ThreadData,sizeof(ThreadData),0))rn rn CEdit *ce=((CEdit*)GetDlgItem(IDC_EDIT_CONTENT));rn ce->LineScroll(ce->GetLineCount()-1);;rn MessageBox("数据发送成功");rn rn每次调试出sended都是1600,就是说已经发送过去了。rn客服端:rnclconect.Receive((char*)&ServerData,sizeof(ServerData),0);rn int len=sizeof(ServerData);rn每次单步调试收到的len也为1600.表示也收到了数据,为什么在后面这两句就错了,就要死,是我哪里错了吗,请大家帮我看看,我纠结了好久啊……rn CString str=ServerData.filedata[0][1];rn MessageBox(str); rnrn其中在服务端类中定义有:Data ThreadData;rn客服端类中定义有:Data ServerData;rn
c++将整数转换为字符串和字符串转化为数字
整数转字符串 1.使用itoa 需要用到的头文件: #include &amp;amp;lt;stdlib.h&amp;amp;gt; # include &amp;amp;lt;stdio.h&amp;amp;gt; # include &amp;amp;lt;stdlib.h&amp;amp;gt; void main (void) { int num = 100; char str[25]; itoa(num, str, 10); printf(&amp;quot;The numb
socket字符串传输
一直连接的socket通话 不足之处还请指出
socket传输字节和字符串
Implementation 'com.tonystark.android:socket:+'基础上写的socket使用工具传输字节和字符串
C# 将整型数组元素转换为字符串
C# 将整型数组元素转换为字符串.别忘了给评分!
将Unicode编码值转换为Unicode字符串
编码值格式为 \u004c\u004f\u0053\u0054\u002e\u0044\u0049\u0052 wstring TranslateString(LPCWSTR szOrig) { wstring wStr; LPCWSTR curChar = szOrig; while (*curChar) { if (curChar[0] == '\\' && (
NPOI,将单元格的值转换为字符串
NPOI,读取Excel单元格,返回字符串
C语言 将字符数组转换为字符串
一般来说,函数返回的类型不能是一个地址,所以说,如果你返回一个地址,编译器会给你警告,但是仍然会正确执行。 但是如果你返回的是一个unsiged char类型的数组地址,那么就有可能出现乱码。 如何解决返回unsigned char类型的数组地址乱码呢,经过尝试找到一个好方法,就是把这个数组转换为字符串,将这个字符串返回出去就好了。 ok,那么现在的关键是如何将字符数组转为字符串。
python3 将字符串unicode转换为中文
&amp;gt;&amp;gt;&amp;gt; aa = '\\u5e7f\\u4e1c\\u7701\\u6df1\\u5733\\u5e02\\u5b9d\\u5b89\\u533a\\u77f3\\u5ca9\\u8857\\u9053\\u6c34\\u7530\\u77f3\\u9f99\\u5927\\u905326\\u53f7' &amp;gt;&amp;gt;&amp;gt; aa.encode('utf-8').deco...
java将字符串json数组转换为list
//json字符串 String jsonStr=&quot;&quot;; //json字符串转jsonArray net.sf.json.JSONArray jsonArr=net.sf.json.JSONArray.fromObject(jsonStr); //如果不添加此行,包含日期格式的转换将报错 JSONUtils.getMorpherRegistry().registerMorpher(new Dat...
将整数转换为字符串的函数是什么
一整型变量counter,我想将其值转换为字符串,函数是什么
怎样将整数转换为字符串?
将整数转换为字符串,大家较好的算法吗(C实现)?
将list转换为String字符串
List<String> cashIdList=new ArrayList<>(set); cashIdsList = new ArrayList<>(set); StringBuilder sb = new StringBuilder(); if (cashIdsList != null && cashIdsList.size() > 0) {
将byte数组转换为十六进制字符串
private static String parseByte2HexStr(byte[] buf) { StringBuffer sb = new StringBuffer(); for (int i = 0; i &lt; buf.length; i++) { String hex = Integer.toHe...
将字符串首字母转换为大写
1.capitalize():首字母变大写 capitalize() capitalize()用来将字符串的第一个字母变成大写,其他字母变为小写。 例: s='apple' s.capitalize() 输出: 'Apple'
C# winform 将HTML转换为字符串
string接收html中的所有内容,不需要去掉标签rn我的代码string a="网址";,获得到的是网址而不是这个网址上的内容rnrn将网址上的内容转换为string
怎样将字节转换为字符串
大家好,现有一个问题请教,在一个二进制文件中有一段字节:rnrnBA C3 BA C3 D1 A7 CF B0 CC EC CC EC CF F2 C9 CF 0D 0A 68 65 6C 6C 6F 77 20 77 6F 72 6C 64 0D 0A 32 30 31 31 2D 31 30 2D 31 32 0D 0Arnrn我需要将它们提取出来并转为字符串保存到文本文件中,以上内容的结果是下面三段内容:rnrn好好学习天天向上rnhellow worldrn2011-10-12rnrn请问该怎么编程,谢谢大家。rn
怎样将页面转换为字符串
就是将页面的html代码转换出来!谢谢
c++将整数转换为字符串
c++转换整数为字符串步骤 1、 判断输入正负,并存储符号 2、 将输入整数从低位到高位存储到字符串指针中 **3、**反转字符串 程序 关键步骤都在程序中进行了注释,以下程序能在vs2015社区版中直接执行,程序如下 #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void itostr(char*...
怎么将整数转换为字符串?
问题是这样的,有一些整数,长度不定,如123,1455,22220……,现在想把它们转换成字符串"123","1455","22220"……,有没有什么好的办法?rnrn我想到的办法是将该数的各个位取出来,分别转换为字符串,然后再将各短的字符串连接成一个长字符串。rn这个办法好像有点笨,希望大家能给个好点的办法。rnrn最好是C语言实现!
C++将地址转换为字符串
C++将地址转换为字符串 有时候在做程序设计的时候,有可能需要做一个类似messageBus的功能,并且需要一个key保证唯一,那么如何实现这个key的唯一呢?大致两种思路: 使用函数签名,因为messagebus绑定的是一个函数,并且对应一个topic,但是为了能够自适应各式各样的函数,就需要模板和元编程来解决,但是这样的局限很大,有一些函数我们是无法获取签名的(你一定会需要的); 使用函数地...
将浮点数和整数转换为字符串
将浮点数和整数转化为字符串,在VC6.0上已经通过的。。。
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池