UNP-UNIX网络编程 第三章:套接字编程简介
2018-01-16 19:57
330 查看
1.IPV4套接字地址结构:
#include <netinet/in.h> struct in_addr { in_addr_t s_addr; //32bit } struct sockaddr_in { uint8_t sin_len; // sa_family_t sin_family; //AF_INET in_port_t sin_port; //16bit struct in_addr sin_addr; char sin_zero[8]; }
2.IPv6套接字地址结构:
#include <netinet/in.h> struct in6_addr { unit8_t s6_addr[16]; } struct sockaddr_in6 { uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; }
3.通用套接字地址结构:
#include <sys/socket.h> struct sockaddr { uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; //protocol-specific address } //很多方法中都是使用sockaddr bind(socked,(struct sockaddr*) &serv,sizeof(serv));
4.新的通用套接字地址结构:
#include <netinet/in.h> /* sockaddr_storage能够满足最苛刻的对齐要求。 sockaddr_storage足够大,能够满足系统支持的任何套接字地址结构。 sockaddr_storage中除了ss_len和ss_family之外,其他字段对用户来说是透明的。sockaddr_storage结构必须强制转换成或复制到适合于ss_family的套接字地址结构中,才能访问其他字段。 */ struck sockaddr_storage { uint8_t ss_len; sa_family_t ss_family; /* 用户透明内容 */ }
5.头文件:
int8_t <sys/types.h> uint8_t <sys/types.h> int16_t <sys/types.h> uint16_t <sys/types.h> int32_t <sys/types.h> uint32_t <sys/types.h> sa_family_t <sys/socket.h> socklen_t <sys/socket.h> in_addr_t <netinet/in.h> in_port_t <netinet/in.h>
6.值-结果参数
参数为指针,可以两个方向互相传值,通俗一点的理解就是:参数既做value输入,又做result返回。就是该参数既是输入参数也是输出参数,相应函数有,accept、recvfrom、getsockname 和 getpeername
struct sockaddr_un cli;
socklen_t len;
len = sizeof(cli);
getpeername(unixfd, (SA*) &cli, &len )
参数有:
select函数中间的3个参数
getsockopt函数的长度参数
msghdr结构中的msg_namelen和msg_controllen字段(recvmsg函数使用)
ifconf结构中的ifc_len字段
sysctl函数两个长的参数中的第一个
7.字节序
字节值的低序位存储在内存起始地址叫小端字节序。字节值的高序位存储在内存起始地址叫大端字节序。
网络协议使用大端字节序。
8.函数
#include <strings.h> void bzero(void *dest, size_t nbytes);//字节操纵函数,指定数目字节置为0; void bcopy(void *src, void *dest, size_t nbytes);//指定数目字节从源到目标串 int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);//比较任意字节穿,相等返回0,否则返回非0
//将字符串形式的ip地址与网络字节序的二进制(存放在套接字地址结构中的值)之间转换 #include <arpa/inet.h>//成功返回1,若输入不是有效的表达式格式返回0 int inet_aton(const char *strptr, struct in_addr *addrptr);//得到二进制;strptr->addrptr char *inet_ntoa(struct in_addr inaddr);//得到十进制 //上面三个只适用于IPv4,下面两个同时适用于IPv4和IPv6 //成功返回1,若输入不是有效的表达式格式返回0,若出错返回-1,strptr->addrptr int inet_pton(int family, const char *strptr, void *addr); //若成功返回指向结果的指针,若出错返回NULL;addrptr->strptr int inet_ntop(int family ,const void *addr, char *strprt, size_t len);
#include <unistd.h> //返回读出的字节数,0表示连接已经关闭?,负数表示出错(一般需要判断errno是否是中断EINTR) ssize_t read(int fd,void *buf,size_t nbytes); //返回写入的字节数,负数表示出错(一般需要判断errno是否是中断EINTR) ssize_t write(int fd,const void *buf,size_t nbytes) // ssize_t readline(int fd,void *buf,size_t maxlen);
read和write存在缓冲区溢出的问题,改进为readn、written、readline函数,避免让调用者处理不足的字节计数值。
相关文章推荐
- UNIX网络编程卷一 笔记 第三章 套接字编程简介
- 《UNIX网络编程》 第三章 套接字编程简介
- UNIX网络编程笔记 第三章 套接字编程简介
- UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数
- UNP卷1:第三章(套接字编程简介)
- 第三章 套接字编程简介
- UNIX网络编程2:套接字编程简介
- UNP总结 Chapter 3 套接字编程简介
- 第三章 套接字编程简介
- UNIX网络编程卷一:第三章 套接字编程简介
- Unix网络编程(三)--套接字编程简介
- 第三章 套接字编程简介
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
- UNP第3章 套接字编程简介
- UNP——Chapter 3:套接字编程简介
- Unix网络编程学习笔记之第3章 套接字编程简介
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
- 《Unix网络编程》卷一(简介TCP/IP、基础套接字编程)
- UNIX网络编程笔记(2)—套接字编程简介
- UNIX网络编程 第3章 套接字编程简介