从网络字节流中提出整数

最近在做一个项目,就是设计一套通信协议,利用nginx来实现解析。协议内容是包括整数和字符串,现在客户端收到服务器端发送的网络字节流时,需要从中提取出整数,再根据整数决定发送数据量的大小。如下所示:

p = u->buffer.pos;

num=*(int*)p

p指向接收到的网络字节流,用这么方式解析得到的整形num不是服务器端发送的数字,是一个很大的数。不对,于是换了种方式:

memcpy(num,p,sizeof(int));
printf("num is %d\n",*(int*)num);

结果还是一样。

但是输出字节流p,能看到后面的字符串是能得到的,但是前面的整数得不到

for(i=0;i<9;i++){
  printf("i :%c \n",p[i]);
}

于是改成以16进制形式输出,结果是可以查看到整数值:

pos last 0
pos last 0
pos last 0
pos last 5
pos last 77
pos last 67
pos last 70
pos last 31
pos last 66

即第4字节的那个5正式服务器端发送的数字,这说明网络字节流是对的。只是不能那样取出来。

这个时候就必须熟悉网络字节流的概念了,搜了下:

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序。

就是网络字节流的序列和主机的序列可能不一样,所以需要一些函数进行转换,linux提供了四个函数:


为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

 

把代码改成:

p=u->buffer.pos;
htnum=ntohl(*(int*)p);
printf("htmum=%d,%x\n",htnum,htnum);

搞定得到正确结果。

这说明进行网络编程时得注意网络字节流的序列,否则不能提取出对应的数据。

转载于:https://www.cnblogs.com/hahawgp/p/3709625.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验3 系统调用

系统调用 实验目的 建立对系统调用接口的深入认识掌握系统调用的基本过程能完成系统调用的全面控制为后续实验做准备 实验内容 此次实验的基本内容是&#xff1a;在Linux 0.11上添加两个系统调用&#xff0c;并编写两个简单的应用程序测试它们。 iam() 第一个系统调用是iam()&a…

python标准库(一)

操作系统接口os 切换目录 >>> import os>>> os.getcwd() # 得到当前工作目录C:\\Users>>> os.chdir(F:\\) # 切换工作目录到F盘>>> os.system(mkdir tody) # 在f盘创建一个叫tody的文件夹0import os 与 from os import * &#xff0c;要…

[Java] webservice soap,wsdl 例子

java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟&#xff0c;但要真正要用起来还需时日!! 由于毕业设计缘故&#xff0c;我看了很多关于webservice方面的知识&#xff0c;今天和大家一起来研究研究webservice的各种使用方法。 一、利用jdk web服务api…

C语言ASM汇编内嵌语法zz

朋友们&#xff0c;我是从http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html这里转载过来的&#xff0c;很不错就收藏了&#xff0c;如果转载&#xff0c;请注明初始链接。 .3 GCC Inline ASM GCC 支持在C/C代码中嵌入汇编代码&#xff0c;这些汇编代码被称作…

python标准库(二)

格式化输出 reprlib 库用来格式化 >>> import reprlib >>> reprlib.repr(set(aabbccddeeeff)) "{a, b, c, d, e, f}" >>>对集合能排序 >>> reprlib.repr(set(fdajfejaa)) "{a, d, e, f, j}" >>>pprint库用…

templates(0.1)

每一位 C 程序员都有自己的一套编程风格。这就引来了各种问题&#xff1a;哪儿应该 插入空白符号、怎么摆放分隔符&#xff08;大括号、小括号&#xff09;…等等。我们尽量保持全书风格一致&#xff0c; 当然有时候我们也对特殊问题作出让步。例如在教本&#xff08;初阶&…

实验4 进程运行轨迹的跟踪与统计

进程运行轨迹的跟踪与统计 难度系数&#xff1a;★★★☆☆ 实验目的 掌握Linux下的多进程编程技术&#xff1b;通过对进程运行轨迹的跟踪来形象化进程的概念&#xff1b;在进程运行轨迹跟踪的基础上进行相应的数据统计&#xff0c;从而能对进程调度算法进行实际的量化评价&…

虚拟环境创建,pip管理包

windows10虚拟环境的创建&#xff0c;pip管理包1.虚拟环境的创建1.1 为什么要创建虚拟环境1.2 创建虚拟环境1.3 激活虚拟环境1.3.1 激活方式1.3.2 检查是否创建成功2.用pip管理包2.1 pip的基本使用2.2 pip创建安装的文件requirements.txt2.3 安装包对应的版本2.4 用pip - r ins…

Linux C编程一些优秀的博客链接

1&#xff0c;C进程内存分布 https://www.cnblogs.com/fengyv/p/3789252.html 2&#xff0c;fork入门讲解 http://blog.csdn.net/jason314/article/details/5640969

vi文字处理器

http://blog.csdn.net/wangloveall/article/details/22649331 摘要&#xff1a;vi是类UNIX命令行接口的标准文字处理软件&#xff0c;也是进行shell脚本程序编写与服务器设置的非常重要的工具。本文介绍vi文字处理器&#xff0c;包括vi简介、vi怎么使用、vi的加强版vim。 关键词…

顺序栈,链栈

栈与链栈一&#xff0c;顺序栈1.1 IStack栈接口1.2&#xff0c;顺序栈增删改查的实现1.3&#xff0c;测试顺序栈二&#xff0c;链栈2.1&#xff0c;存放数据的结点2.2&#xff0c;链栈的实现2.3测试链栈一&#xff0c;顺序栈 1.1 IStack栈接口 public interface IStack {publ…

Ubuntu14.04LTS打造实用的环境

1&#xff0c;安装Ubuntu14.04LTS以后&#xff0c;首先要更新一下源&#xff0c;下面使用163源&#xff1a; 首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup清空原来的/etc/apt/sources.list&#xff0c;添加网易的源列表 deb http://mirrors.…

用numpy,matplotlib库画笛卡尔爱心曲线

1650年&#xff0c;斯德哥尔摩的街头&#xff0c;52岁的笛卡尔邂逅了18岁的瑞典公主克里斯汀。   那时&#xff0c;落魄、一文不名的笛卡尔过着乞讨的生活&#xff0c;全部的财产只有身上穿的破破烂烂的衣服和随身所带的几本数学书籍。生性清高的笛卡尔从来不开口请求路人施舍…

poj 1715 Hexadecimal Numbers 排列组合

1 /**2 大意&#xff1a; 给定16进制数的16个字母&#xff0c;&#xff0c;求第k大的数&#xff0c;&#xff0c;要求数的长度最大为8.&#xff0c;并且每个数互不相同。3 思路&#xff1a; 从高到低挨个枚举&#xff0c;每一位能组成的排列数 &#xff0c;拿最高位来说&#x…

centos7虚拟机共享本机磁盘的方法

说明&#xff1a;这个方法不一定是通用的&#xff0c;也可能不是最快捷的&#xff0c;但是感觉比较稳妥的办法。 1&#xff0c;首先坚持两个进程是否启动&#xff1a;右击&#xff1a;我的电脑-管理-服务&#xff0c;检查server服务和Workstation服务是否启动。如果没有启动&a…

文件读写的“二进制模式”和“文本模式”

二进制模式&#xff1a;将内存中的数据&#xff08;01序列&#xff09;直接传送到文件中&#xff0c;没有任何转换。如&#xff1a;char ch 0x7d; fwrite(&ch, sizeof(char), 1, pfile);直接把0x7d这个01序列存储到文件中。文本模式&#xff1a;将内存中的数据&#xff08…

服务器小程序servlet的使用

servlet的创建使用一&#xff0c;三种创建方式1.1 实现servlet接口1.2 继承GenericServlet1.3 继承HttpServlet二&#xff0c;servlet使用2.1 web.xml文件的配置2.1.1 创建xml文件2.1.2 手写web.xml文件2.2 在8080端口下访问2.2.1 servlet的生命周期servlet是服务器小程序。是个…

hadoop MultipleInputs fails with ClassCastException (get fileName)

来自&#xff1a;http://stackoverflow.com/questions/11130145/hadoop-multipleinputs-fails-with-classcastexception Following up on my comment, the Javadocs for TaggedInputSplit confirms that you are probably wrongly casting the input split to a FileSplit: /**…