Socket传输结构体数据注意事项
来源:互联网 发布:windows能开发ios吗 编辑:程序博客网 时间:2024/05/18 18:20
【1 背景】
在Socket通信中,要传输结构化的数据或者要进行协议数据传输的时候,发送端必须要构造结构体进行数据传输。
接收端也必须通过同样的结构体进行解析。
但Socket传输结构体数据时候,稍有不慎就会出现:1)解析数据出错;2)接收数据不完整;3)解析为乱码等的Bug。
【2 举例】
如下是接收端解析数据为乱码甚至崩溃的一类常见错误。
结构体也就是一段连续的内存。 但是类似如下的结构体:
typedef struct _PER_SPIDER_INFO
{
UINT nTimeDelay;
UINT nRtnCode;
UINT nUrlPageLen;
char* pszUrlPage;
}PER_SPIDER_INFO;
typedef struct _PER_SPIDER_INFO
{
UINT nTimeDelay;
UINT nRtnCode;
UINT nUrlPageLen;
char* pszUrlPage;
}PER_SPIDER_INFO;
不能直接通过传输的。
【3 根本原因】
如下:
1)结构体成员pszUrlPage是指针,指向的是结构体以外的内存地址,也就是在结构体PER_SPIDER_INFO外的非连续的地址空间。
2)如果仅传输pszUrlPage,也就是传输了一个地址,在当前进程空间是可以索引到对应的值。但是一旦通过Socket实现网络传输,即出现了跨进程、跨网络的传输,一个地址传输过去,极大可能甚至100%会读到我们不想要的地址空间,读取的值也会出错。一旦该地址空间不允许读,则会导致程序崩溃。(如下图所示)
3)可以传输,正如2)所说,但一旦接受后对方机器无法正确解析,甚至程序崩溃。
【4 Bug解决步骤路演】
Step1: 缩小范围,只传输int数据,ok;但单包含了字符串指针就不可以;基本锁定是字符串这里除了问题。
Step2:字符串指针换成字符串数组,Bug不再出现。说明至少是连续内存这里出了问题。期间,怀疑动态分配内存malloc()以及strcpy,memcpy,传输结构体数据的长度出了问题,花了近3个小时排查。
Step3:进而换成给定长度(大小结合项目定)的字符串数组,Bug解决掉。
【5 修正后】
typedef struct _PER_SPIDER_INFO
{
UINT nTimeDelay;
UINT nRtnCode;
UINT nUrlPageLen;
char szUrlPage[MAX_URL_PATH]
}PER_SPIDER_INFO;
{
UINT nTimeDelay;
UINT nRtnCode;
UINT nUrlPageLen;
char szUrlPage[MAX_URL_PATH]
}PER_SPIDER_INFO;
就可以通过socket传输了。
【6反思与思考】
但是不是包含指针的就不能传输了呢?不是的,只要内存处理的得当也是可以的。回头有示例再附上解析。
未完待续。
作者:铭毅天下
转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/47342541
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!
1 0
- Socket传输结构体数据注意事项
- c#中利用结构体进行socket传输数据
- 谈Socket传输结构体
- C++ socket传输结构体
- Linux socket 传输和接受结构体
- 【转】socket不能直接传输结构体!
- socket传输结构体send()
- Linux C socket传输结构体
- SOCKET传输数据、文件
- Socket TCP传输数据
- socket UDP传输数据
- TCP-socket发送结构体类型数据
- 通过SOCKET发送、接收结构体数据
- Java 与 C socket通信传输结构体消息/Java解析C语言结构体
- 利用UDP传输结构体数据 structdata over udp
- Flex 和C++ 之间传输结构体数据--用XML传输
- scoket传输结构体
- C#实现Socket传输简单数据
- Bootstrap学习--导航栏
- C 语言和C++语言的 struct对比
- Oracle的PSU、CPU及Patch Set
- Python IDLE(python GUI)与python(comand line)有什么区别
- C#事件与委托详解
- Socket传输结构体数据注意事项
- poj 2752 seek the name,seek the fame【KMP】
- ffmpeg: error while loading shared libraries: libavdevice.so.55: cannot open shared object file: No
- OC学习:OC中实现多继承
- pip install lxml因网络问题失败
- 非常好的理解遗传算法的例子
- JMeter下变量在线程组间的使用
- UIWebView的使用
- 自定义UI制作流程