来源:http://www.delphibbs.com/delphibbs/dispq.asp?lid=2190549

procedure TForm1.Button1Click(Sender: TObject);
type TDebugDL = record
   Parm1:String;
   Parm2:String;
   Parm3:String;
   Parm4:String;
   Parm5:String;
   Parm6:String;
   Parm7:String;
end;
var
   FSyn_Buf: array[0..2] of char;
   TheStream: TWinSocketStream;
   ClientSocket: TClientSocket;
   iPkglen: integer;
   iTotalPkg: Word;
   DebugDL: TDebugDL;
begin
DebugDL.Parm1:=Format('%-6s',['010200']);
DebugDL.Parm2:=Format('%-6s',['335615']);
DebugDL.Parm3:=Format('%-10s',['100120130']);
DebugDL.Parm4:=Format('%-8s',['']);
DebugDL.Parm5:=Format('%-2s',['']);
DebugDL.Parm6:=Format('%-2s',['02']);
DebugDL.Parm7:=Format('%-5s',['96528']);
FSyn_Buf[0] := #2;
FSyn_Buf[1] := #0;
FSyn_Buf[2] := #0;
iPkglen:= sizeof(DebugDL);                  //数据包长度
iTotalPkg:= htons(word(iPkglen));   <font color=red>(*为什么运行到这句要发生错误*)</font>
//建立连接
ClientSocket:= TClientSocket.Create(nil);
TheStream:= TWinSocketStream.Create(ClientSocket.Socket,6000);
ClientSocket.ClientType:= ctBlocking;
ClientSocket.Address:= '172.16.2.1';
ClientSocket.Port :=3000;
ClientSocket.Open;
TheStream.Write(FSyn_Buf,4);                 //发包头
TheStream.Write(iTotalPkg,2);                //发长度
//  TheStream.Write(htons(iTotalPkg),2);       //发内容
FillChar(Buffer1, 5, 0);
if TheStream.WaitForData(6000) then begin
   TheStream.Read(Buffer1,4);
   for i:=0 to 5-1 do  //前4位是包的长度
     strRec:=strRec+Buffer1[i];
   showmessage(strRec);
end;
end;


计算机处理器有两种排序方式:big-endian和little-endian。
intel86处理器用little-endian:字节的排序是从最无意义的字节到最有意义的字节。称为“主机字节顺序”。
在网络上指定IP地址和端口号,必须用big-endian来表示:从最有意义的字节到最无意义的字节。一般称之为“网络字节顺序”。
主机字节顺序与网络字节顺序的转换函数:
u_long htonl(u_long hostlogn);
int WSAHtonl(
SOCKET s,
u_long hostlogn,
u_long FAR * lpnetlong
);
u_short htons(u_short hostshort);
int WSAHtons(
SOCKET s,
u_short hostshort,
u_short FAR * lpnetshort
);
htonl和WSAHtonl的hostlong参数是按主机字节顺序排序的一个4字节数。
htonl函数返回的数网络字节顺序,WSAHtonl函数通过lpnetlogn参数返回网络字节顺序排序数。用于IP地址转换。
htons和WSAHtons的hostshort参数是按主机字节顺序排序的一个2字节数。用于端口转换。
htons函数把这个hostshort参数当作按网络字节排序的一个2字节数返回,而WSAHtons函数则通过lpnetshort参数返回。
下面4个函数是前4个函数的逆向函数,它们把网络字节顺序转换成主机字节顺序:
u_long ntohl(u_long netlong);
int WSANtohl(
SOCKET s,
u_long netlog,
u_long FAR * lphostlong
);
u_short ntohs(u_short netshort);
int WSANtohs(
SOCKET s,
u_short netshort,
u_short FAR * lphostshort
);
例:
var
InternetAddr: TSockAddrIn;
const
nProtId = 5150; //端口号。主机字节顺序排序格式
cp = '136.149.3.29'; //IP地址。点分internet地址格式
begin
{使用IP地址族}
InternetAddr.sin_family := AF_INET;
{将cp转换为4字节整数,并把它分配给sin_addr}
InternetAddr.sin_addr.S_addr := inet_addr(cp);
{将字段转换为网络字节顺序,并分配给sin_port}
InternetAddr.sin_port := htons(nProtId);
end;


来自: Another_eYes, 时间: 2003-09-22 7:56:00, ID: 2191192 
应当没有错的,最多出来一个warning(也许你的哪个编译开关不对所以无法运行?)。
因为Integer->Word强制类型转换可能造成数据失真。用iTotalPkg:= htons(word(Cardinal(iPkglen)))试试。

说句题外话:
iPkglen:= sizeof(DebugDL);                  //数据包长度
这句没有意义,因为iPkglen永远等于28(不管你param1~param7中有没有数据也不管你那里面的数据是什么)

来自: youjq, 时间: 2003-09-22 14:39:00, ID: 2192327 
TO:Another_eYes
我试过加Cardinal也没用,运行到Htons这句时屏幕就会弹出一个错误框好象
是什么内存地址出错什么的,是系统的。还有其他办法吗?

来自: youjq, 时间: 2003-09-22 18:16:00, ID: 2193094 
问题解决了,原因是我 use  了idwinsocket 应该use winsocket就对了

转载于:https://www.cnblogs.com/railgunman/archive/2010/11/23/1885959.html

网络高手看过来:为什么我用htons转换网络节序时会发生错误?200元大洋伺候...相关推荐

  1. 第二十六期:100 个网络基础知识普及,看完成半个网络高手

    本篇文章是关于100个网络基础知识普及,看完成半个网络高手!下面,我们一起来看. 作者:佚名来源 本篇文章是关于100个网络基础知识普及,看完成半个网络高手!下面,我们一起来看. 1)什么是链接? 链 ...

  2. 这100 个网络基础知识 看完成半个网络高手

    这100 个网络基础知识 看完成半个网络高手 1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 O ...

  3. 100 个网络基础知识普及,看完成半个网络高手!(文末附PDF版本)

    点击上方"涛哥聊Python",选择"星标"公众号 重磅干货,第一时间送达 来源:CU技术社区 阅读文本大概需要 5 分钟 为了方便大家更好着按需查找对应知识点 ...

  4. 100 个网络基础知识普及,看完成半个网络高手! 【厦门微思网络】

    1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层, ...

  5. 100 个网络基础知识,看完成半个网络高手

    本文来自网络,相关著作权归原作者所有 1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层 ...

  6. 这100 个网络基础知识,看完成半个网络高手

    1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层, ...

  7. 100 个网络基础知识普及,看完成半个网络高手

    1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层, ...

  8. 100个网络基础知识普及,看完你也是半个网络高手哦! 随风

    1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电 缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层 ...

  9. 100 个网络基础知识看完,可以成半个网络高手

    1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层, ...

最新文章

  1. dock run mysql v3_docker run mysql成功,但是3306端口不通?
  2. 【采用】风控老客户续贷业务知识
  3. OpenCV扫描图像,查找表和时间测量
  4. goudp文件传输服务器,golang udp服务端客户端例子
  5. 代码区,初始化全局数据区,BSS,堆区,栈区,程序环境变量区简介
  6. JavaWeb开发概念了解
  7. Java(Android)线程池
  8. Quartz - 作业调度框架-插件化开发
  9. 新闻发布项目——业务逻辑层(categoryTBService)
  10. 简单的Gradle Java插件自定义
  11. nginx配置url重写
  12. QT [007] QT UI 的控件操控问题 - 如何操控多嵌套的UI控件
  13. STM32通用和复用功能IO
  14. 异常检测算法:孤立森林(Isolation Forest)
  15. Python微信文章 抓取转PDF
  16. 用Mothur制作OTUtable
  17. dango之day01
  18. 如何做一名有趣的家长?
  19. 奇思妙想,动手 DIY 你的浏览器主页
  20. PYTHON将成绩从百分制变换到等级制

热门文章

  1. 腾讯云标准型S3服务器独享100%CPU性能评测
  2. 结构体struct声明、定义
  3. 用外置显卡跑深度学习的一些注意事项
  4. JinJa2-测试器
  5. 凡客平台数据接口,根据ID取商品详情,Onebound电商API
  6. Linux内核进程管理实时调度与SMP
  7. Python + PySpider 抓取百度图片搜索的图片
  8. 哈工大李志军操作系统 —(四)设备驱动与文件系统—目录与文件系统L31.L32
  9. 〖产品思维训练白宝书 - 产品思维认知篇⑪〗- 学习 产品思维 对我们有哪些好处?
  10. Ubuntu限制本地上传、下载网速(限速)