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 < ...
随机推荐
- markdown学习笔记 (一)
##类Atx形式标题 # H1标题(一个井号加文字) ### H3标题(三个井号加文字) ###### H6标题(6个井号加文字) 类setext ======== 一级标题(下行加若干个等号) == ...
- 查看centos版本号
--写在开始-- 玩Linux,不同的版本会有一些细微区别: so,经常需要查看服务器版本号: --正文-- 有以下命令可以查看linux服务器版本号: # lsb_release -a LSB Ve ...
- U-BLOX GPS 模块及GPRMC指令解析
受朋友所托,调试一款GPS模块,该模块是UBLOX的NEO-6M GPS模组.想到用这款GPS的人较多,自己日后也有可能在用到这个模块,就写下这份笔记. 1. 介绍 基本信息如下: 1, 模块采用U- ...
- Asp.net MVC的Model Binder工作流程以及扩展方法(2) - Binder Attribute
上篇文章中分析了Custom Binder的弊端: 由于Custom Binder是和具体的类型相关,比如指定类型A由我们的Custom Binder解析,那么导致系统运行中的所有Action的访问参 ...
- jq+css+html简单实现导航下拉菜单
相信导航栏下拉菜单是web开发最常见的一个item了.这里就不做介绍了,直接上code. Html部分 <div class="_nav"> <ul id=&qu ...
- MYSQL 5.7 添加新用户
错误描述: 添加用户 insert into mysql.user(Host,User,Password) values("localhost","test", ...
- WIN 下的超动态菜单(二)用法
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ ...
- java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
今天把sql server 2008 r2装了起来,64位的,然后就迫不及待地体验连接数据库的操作,编程语言是java.我一开始学了一种非常老的连接方式,使用JDBC-ODBC桥.初次使用不太熟练,所 ...
- hadoop2.6---windows下开发环境搭建
一.准备插件 1.自己编译 1.1 安装Ant 官网下载Ant,apache-ant-1.9.6-bin.zip 配置环境变量,新建ANT_HOME,值是E:\apache-ant-1.9.6:PAT ...
- 大话设计模式C++版——观察者模式
观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式. 这里以大话设计模式中的例子为例,办公室员工A.B.C在 ...