如何从这结构中取出地址与端口

hanxian 2005-07-02 03:01:08
sockaddr_in = record
 sa_family: u_short;
 sa_data: array[0..13] of Char;
end;
这是通过getPeerName返回客户端地址信息的变量类型

如何从sa_data: array[0..13] of char 这个数组中取回IP 与PORT


...全文
156 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
li2002 2005-07-22
  • 打赏
  • 举报
回复

这里我再想说明几点:

Siw(浪中沙) 所说的结构没有错。但是给出得端口号 port 需经过转换。

从结构里取出 port:
1、ntohs(); 例:port = ntohs( sa_data.sin_port )

向结构例写入 port:
2、htons() 例:sa_data.sin_port = htons( port )

这里转换函数的字符串含义:

h 表示主机 host.
to 转换方向从左至右
n 表示网络 net
s 表示短字 short
l 表示长字 long
jenycheng 2005-07-15
  • 打赏
  • 举报
回复
学习......
li2002 2005-07-14
  • 打赏
  • 举报
回复
在程序开始 uses 中加上 winsock 以后,sockaddr_in 可直接调用:
sa_data: sockaddr_in;

端口号写入结构中:
sa_data.sin_port := htons(1234);

IP地址写入结构中:
sa_data.sin_addr.S_addr := inet_addr('192.168.0.1');

从结构里取出端口号:
port:=ntohs(sa_datar.sin_port);

从结构里取出IP地址:
IP := inet_ntoa(sa_data.sin_addr);

qrlvls 2005-07-04
  • 打赏
  • 举报
回复
UP,楼上正解
这是一个标准的 SOCKADDR_IN 结构
Caps77 2005-07-04
  • 打赏
  • 举报
回复
接分
Siw 2005-07-03
  • 打赏
  • 举报
回复
sockaddr_in的实际使用结构如下
struct sockaddr_in
{
u_short sin_family; //Address Family
u_short sin_port; //IP Port
in_addr sin_addr; //IP address
char sin_zero[8]; //Padding to make structure the same size as SOCKADDR
}.

具体定义说明可以参看MSDN中对 SOCKADDR,SOCKADDR_IN的定义
其实只要知道数据分布情况,就能提取需要的信息了。

根据你的情况,可以提取你需要的信息(我是按照C++语法描述)

端口号为
u_short port = ((short*)sa_data)[0];

IP地址为
long ip = ((long*)(sa_data+2))[0];
或者是
uchar b_i = sa_data[2+i]。




hanxian 2005-07-02
  • 打赏
  • 举报
回复
UP
hanxian 2005-07-02
  • 打赏
  • 举报
回复
.....
好像没人知道
hanxian 2005-07-02
  • 打赏
  • 举报
回复
UP
UP
UP
UP

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧