Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
IPv4套接字地址结构
struct sockaddr_in
{
uint8_t sinlen;(4个字节)
sa_family_t sin_family;(4个字节)
in_port_t sin_port;(2个字节)
struct in_addr sin_addr;(4个字节)
char sin_zero[];
};
sin_len:整个sockaddr_in结构体的长度,部分Linux内核版本没有该成员
sin_family:指定该地址家族,一般设置为AF_INET(使用TCP,UDP协议)
sin_port:端口
sin_addr:IPv4的地址
sin_zero:暂不使用,一般将其设置为0 通用地址结构
struct sockaddr
{
uint8_t sin_len;(4个字节)
sa_family_t sin_family;(4个字节)
char sa_data[];
};
sin_len:整个sockaddr结构的长度
sin_family:指定该地址家族
sa_data:由sin_family决定它的形式 结论:struct sockaddr_in与struct sockaddr结构大小相同
字节序
大端字节序
--最高有效位存储与最低内存地址处,最低有效位存储于最高内存地址处 小端字节序
--最高有效位存储于最高内存地址处,最低有效位存储于最低内存地址处 主机字节序
--不同主机有不同的字节序,如x86小端字节序,,Motorola 6800为大端字节序 网络字节序
--网络字节序规定为大端字节序 字节序说明:一个int类型变量254存储在内存中,如果变量的百位存储于内存地址条上的低地址处,
个位存储于内存地址条上的高地址处(即变量存储序列和内存地址序列相反)这就是大端字节序,反之则是小端字节序。
各个主机的字节序是不同的,但是在网络中传输,必须要一个统一的字节序,这就是网络字节序。
字节序转换函数
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
说明:在上述函数中,h代表host;n代表networks;s代表short;l代表long。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <arpa/inet.h> int main(int arg, char *args[])
{
unsigned int data = 0x12345678;
char *p = (char *)&data;
printf("%x,%x,%x,%x\n", p[], p[], p[], p[]);
/*
* 对于数组而言,内存地址一定是递增的,p[0]=*(p+0);p[1]=*(p+1);
* 如果data变量的最低有效位处于p+0这个低内存地址位,说明这是小端字节序
* */
if (p[] == 0x78)
{
printf("主机是小端字节序\n");
} else
{
printf("主机是大端字节序\n");
}
//字节序转换函数
uint32_t ndata = htonl(data);
p = (char *)&ndata;
printf("%x,%x,%x,%x\n", p[], p[], p[], p[]);
if (p[] == 0x78)
{
printf("网络字节序是小端字节序\n");
} else
{
printf("网络字节序是大端字节序\n");
}
return ;
}
地址转换函数
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
}; int inet_aton(const char *p,struct in_addr *inp);
将点分十进制(192.168.1.116)转化成struct in_addr in_addr_t inet_addr(const char * cp);
将点分十进制转化成32bit char *inet_ntoa(struct in_addr in);//注意:这里参数是结构体变量,而非结构体指针
将struct结构体变量转化成点分十进制
inet_ntoa()返回值是char *,这个char *的内存空间是在inet_ntoa()函数中静态分配的,因此inet_ntoa()后面的调用会覆盖上一次调用,inet_ntoa()是线程不安全函数。
套接字类型
.流式套接字(SOCK_STREAM)
--提供面向连接的,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。
.数据报式套接字(SOCK_DGRAM)
--提供无连接服务,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
.原始套接字(SOCK_RAW)
Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)的更多相关文章
- 【转】Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备
原文:https://www.cnblogs.com/bakari/p/10449664.html -------------------------------------------------- ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践
TCP和UDP的区别 TCP是一个面向连接的.可靠的.基于字节流的传输层协议. 而UDP是一个面向无连接的传输层协议. 具体来分析,和 UDP 相比,TCP 有三大核心特性: 面向连接:所谓的连接,指 ...
- 【UNIX网络编程(一)】套接字地址结构、网络字节顺序和地址转换功能
介绍:应该用在网络编程实现每个套接字地址结构.所以主套接字地址结构后前提网络计划编制,地址结构可以在两个方向上发送:从工艺到内核和内核处理.构中的二进制值之间进行转换. 大多数套接字函数都须要一个指向 ...
- socket编程相关的结构体和字节序转换、IP、PORT转换函数
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- Linux 网络编程详解九
TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- Linux 网络编程详解二(socket创建流程、多进程版)
netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...
随机推荐
- Spark:一个高效的分布式计算系统
概述 什么是Spark ◆ Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥 ...
- 开源游戏 “Elvish Bird”
简介: 这个游戏是我在今年(2014/03)课余时闲着无聊做的一个冒险类小游戏,总共花了5个工作日才完成,为了游戏的效率,做了很多优化,目前在IE8以上浏览器能够流畅运行,运行时如果屏幕分辨率不兼容, ...
- 适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )
在一些应用中,通常会用到很多由一些常量来进行描述的状态数据,比如性别(男.女),审核(未审核.已审核)等.在数据库中一般用数字形式来存储,比如0.1等. 不好的做法 经常看到一些应用(ps:最近又看到 ...
- OEM代工厂产品经理个人经历谈
创业不是一件随随便便的事情! 到2007年时,我已经在上海.广州.东莞三地的工厂打工有十来年了.正是这个时间结点,我也即将做父亲了.打了很久的工后,就开始感到疲倦,做来做去,都是给老板做,也就在这时开 ...
- Linux中如何解压iso类型文件
在Linux下如何解压iso类型的文件呢? 可以使用mount命令来处理 [root@DB-Server tmp]# ls /tmp/rhel-server-5.7-x86_64-dvd.iso /t ...
- Sqlite学习笔记(三)&&WAL性能测试
WAL是SQLite3.7.0版本引入的一个重大改进.SQLite官网宣称在很多使用场景下,WAL模型的性能都要好于默认的DELETE模式.下面将针对几个主要场景对WAL性能做测试,测试的硬件与xxx ...
- Aforge.net之旅——开篇:从识别验证码开始
时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈...前几天老大问我 怎么这么长时间都没写博客了,好吧,继续坚持,继续分享我的心得体会. 这个系列我们 ...
- 【Linux】将Oracle安装目录从根目录下迁移到逻辑卷
[Linux]将Oracle安装目录从根目录下迁移到逻辑卷 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到 ...
- Python基本语法[二],python入门到精通[四]
在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...
- 【hadoop】——MapReduce解压缩实现
转载请注明出处:http://www.cnblogs.com/zhengrunjian/p/4527269.html 1作为输入 当压缩文件做为mapreduce的输入时,mapreduce将自动通过 ...