1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数
更新时间:2023-11-24 12:43:01 阅读量: 教育文库 文档下载
1Socket编程
socket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP 地址+端口号”就称为socket。
在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连 接的一对一关系。
TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socket API。
本章的主要内容是socket API,主要介绍TCP协议的函数接口,最后介绍UDP协议和UNIXDomain Socket的函数接口。
图11.1:socketAPI
2 网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的 多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分, 那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。例如上一节的UDP
段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03, 地址1是0xe8,也就是先发0x03,再发0xe8,这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址存0xe8。但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。因此,发送主机把1000填到发送缓冲区之前需要做字节序的转换。同样地,接收主机如果是小端字节序的,接到16位的源端口号也要做字节序的转换。如果主机是大端字节序的,发送和接收都不需要做转换。同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。 3函数介绍
A 依赖的头文件
#include
B 函数声明
#include
uint32_thtonl(uint32_t hostlong); uint16_thtons(uint16_t hostshort); uint32_tntohl(uint32_t netlong); uint16_tntohs(uint16_t netshort);
h表示host,n表示network,l表示32位长整数,s表示16位短整数。 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
uint32_thtonl(uint32_t hostlong); 名称: htonl 功能: The htonl() function converts the unsigned integer hostlong from hostbyte order to network byte order 头文件: #include 函数原形: uint32_t htonl(uint32_t hostlong); 参数: 返回值: uint16_thtons(uint16_t hostshort); 名称: htons 功能: The htons() function converts the unsigned short integer hostshort from host byte order to network byte order. 头文件: #include 函数原形: uint16_t htons(uint16_t hostshort); 参数: 返回值:
uint32_tntohl(uint32_t netlong); 名称: ntohl 功能: The ntohl() function converts the unsigned integer netlong from network byte order to host byte order. 头文件: #include 函数原形: uint32_t ntohl(uint32_t netlong); 参数: 返回值:
uint16_tntohs(uint16_t netshort); 名称: ntohs 功能: The ntohs() function converts the unsigned short integer netshort from network byte order to host byte order. 头文件: #include 函数原形: uint16_t ntohs(uint16_t netshort); 参数: 返回值: 4 IP地址转换函数 #include
intinet_aton(const char *cp, structin_addr *inp); in_addr_tinet_addr(const char *cp); char *inet_ntoa(structin_addr in); 只能处理IPv4的ip地址 不可重入函数
注意参数是structin_addr 现在
#include
intinet_pton(intaf, const char *src, void *dst);
const char *inet_ntop(intaf, const void *src, char *dst, socklen_t size);
支持IPv4和IPv6 可重入函数
其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr,还可以转换IPv6的in6_addr,因此函数接口是void *addrptr
5 sockaddr数据结构
strcutsockaddr很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结
构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至 于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转 化为所需的地址类型
图 11.2:sockaddr数据结构
structsockaddr {
sa_family_tsa_family; /* address family, AF_xxx */ charsa_data[14]; /* 14 bytes of protocol address */ };
structsockaddr_in {
__kernel_sa_family_tsin_family; /* Address family */ __be16 sin_port; /* Port number */
structin_addrsin_addr; /* Internet address */ /* Pad to size of `structsockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - sizeof(unsigned short int) - sizeof(structin_addr)]; };
/* Internet address. */ structin_addr {
__be32 s_addr; };
struct sockaddr_in6 {
unsigned short int sin6_family; /* AF_INET6 */
__be16 sin6_port; /* Transport layer port # */ __be32 sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */
__u32 sin6_scope_id; /* scope id (new in RFC2553) */ };
struct in6_addr { union {
__u8 u6_addr8[16]; __be16 u6_addr16[8]; __be32 u6_addr32[4]; } in6_u;
#define s6_addr in6_u.u6_addr8 #define s6_addr16 in6_u.u6_addr16 #define s6_addr32 in6_u.u6_addr32 };
#define UNIX_PATH_MAX 108 structsockaddr_un {
__kernel_sa_family_tsun_family; /* AF_UNIX */ charsun_path[UNIX_PATH_MAX]; /* pathname */ };
Pv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包 括16位端口号和32位IP地址,IPv6地址用sockaddr_in6结构体表示,包括16位端口号、128位IP地址和一些控制字段。UNIX Domain Socket的地址格式定义在sys/un.h中,用sockaddr_un结构体表示。各种socket地址结构体的开头都是相同的,前16位表示整个结构体的长度(并不是所有UNIX的实现都有长度字段,如Linux就没有),后16位表示地址类型。IPv4、IPv6和Unix Domain Socket的地址类型分别定义为常数AF_INET、AF_INET6、AF_UNIX。这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。因此,socket API可以接受各种类型的sockaddr结构体指针做参数,例如bind、accept、connect等函数,这些函数的参数应该设计成void *类型以便接受各种类型的指针,但是sock API的实现早于ANSI C标准化,那时还没有void *类型,因此这些函数的参数都用structsockaddr *类型表示,在传递参数之前要强制类型转换一下,例如: structsockaddr_inservaddr; /* initialize servaddr*/
bind(listen_fd,(structsockaddr *)&servaddr,sizeof(servaddr));
6 网络套接字函数 A socket
#include
intsocket(intdomain,inttypes,int protocol);
domain:
AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址 AF_INET6 与上面类似,不过是来用IPv6的地址
正在阅读:
1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数11-24
未来生活作文800字06-17
小学二年级语文综合实践活动课07-08
(Word可编辑)(10套)天津市高考数学复习 题型专练汇总04-30
2016年新闻直通车广播稿02-23
模拟试题301-03
《金融学》计算习题11-08
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 函数
- 编程
- 套接字
- socket
- 数据结构
- 网络
- 字节
- sockaddr
- 转换
- 地址
- 介绍
- 北师大版小学数学五年级下册教案全册
- 深圳市盐田区分区规划说明(新) - 图文
- 大课间跑操小课题
- 安徽大学vb模拟题
- 关于济南市红色文化现状、保护与传承的实践报告
- 最新冀教小学科学四年级下册册《24未来农业》教案
- 2018北师大版五年级数学下册第二单元《长方体(一)》单元测试
- 北京某高层住宅楼施工组织设计(18层 - 剪力墙 - 创长城杯) - 图文
- 企业会计招聘笔试试题及答案-含外企英文试题
- 数学知识点秋青岛版数学五年级上册第四单元信息窗4《列方程解决实际问题》word教案-总结
- ES纤维行业国内外发展概述(报告精选) - 图文
- 基于AT89S52单片机的万年历设计
- 总经办秘书(总经理助理)工作职责
- 媒介素养
- 三年级数学下册《期末检测试卷》(附答案)
- 工作人员应对上访现场处置方案
- 福建茶叶出口现状及对策的论文正文
- 华东师范大学2008至2009学年第2学期高等数学期末考试试题
- 北京市西城区2013高三4月一模--文综(word版)
- 初一分班语文试题