第三章-套接字接口编程简介
//自己学习笔记和摘录,留着以后看
前言:网络编程要涉及的那就是socket API,不少书只对一些API做了一些简单的阐述和说明,对于函数中的结构体确没有说的特别详细,这本书就比较详细。所谓知其然,知其所以然,看懂了一些底层细节的东西,coding相对也会比较轻松。做为小白的我觉得应该就是这个理。第三章基本就是一些结构体、转换函数的介绍。
1.Socket Address Structures
//结构体in_addr 存放32-bit的IPv4地址
View Code
1 struct in_addr { 2 in_addr_t s_addr; /* 32-bit IPv4 address */ 3 /* network byte ordered */ 4 };
//结构体sockaddr_in 存储protocol和port等,该结构体中包含了上述的in_addr结构体 在<netinet/in.h>头文件中定义
View Code
1 struct sockaddr_in { 2 uint8_t sin_len; /* length of structure (16) */ 3 sa_family_t sin_family; /* AF_INET */ 4 in_port_t sin_port; /* 16-bit TCP or UDP port number */ 5 /* network byte ordered */ 6 struct in_addr sin_addr; /* 32-bit IPv4 address */ 7 /* network byte ordered */ 8 char sin_zero[8]; /* unused */ 9 };
sockaddr_in结构体成员说明
- 长度成员sin_len,无需设置、检查,除非涉及到路由套接口(17章) //没碰到过 不懂??
- sin_zero成员暂不使用,总设置为0 //做为预留??
通用套接口地址结构sockaddr 在<sys/socket.h>中定义
//socket 地址结构是通过指针传递的,为了能处理所有协议族的套接口地址结构,所以定义了一个sockaddr结构体将所有传递进来的套接口地址结构强制转换成sockaddr类型,下面bind函数的第二个参数就是将sockaddr_in结构体类型强制转换成了sockaddr通用类型。ps:以前写socket程序时对这个参数的理解一直云里雾里,现在看了才恍然大悟,搜碟四内...
1 bind(sockfd, (struct sockaddr *) &serv, sizeof(serv));
View Code
1 struct sockaddr { 2 uint8_t sa_len; 3 sa_family_t sa_family; /* address family: AF_xxx value */ 4 char sa_data[14]; /* protocol-specific address */ 5 };
IPv6的结构先搁置.....
2.字节操作函数
- 第一组函数,以字母b开头,起源于4.2BSD(Berkeley Software Distribution)支持几乎所有的系统
- 第二组函数,以mem打头,起源ANSI C标准,支持ANSI C库的系统
- //能否这样理解? 类似bzero的第一类函数能在window下跑,而mem打头的不能在linux跑???
View Code
1 #include <strings.h> 2 void bzero(void *dest, size_t nbytes); 3 void bcopy(const void *src, void *dest, size_t nbytes); 4 int bcmp(const void *ptr1, const void *ptr2, size_t nbytes); 5 Returns: 0 if equal, nonzero if unequal 6
View Code
1 #include <string.h> 2 void *memset(void *dest, int c, size_t len); 3 void *memcpy(void *dest, const void *src, size_t nbytes); 4 int memcmp(const void *ptr1, const void *ptr2, size_t nbytes); 5 Returns: 0 if equal, <0 or >0 if unequal 6


浙公网安备 33010602011771号