套接字编程简介
2016-12-17 00:30
155 查看
套接字地址结构
IPv4套接字地址结构
以sockaddr_in命名,定义在
<netinet/in.h>中。
typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; // 32-bit IPv4 addr, network byte ordered }; struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; // AF_INET in_port_t sin_port; // 16-bit TCP or UDP port number, network byte ordered struct in_addr sin_addr; // 32-bit IPv4 addr, network byte ordered char sin_zero[8]; // unused };
POSIX规范只需要这个结构中的三个字段:
sin_family
sin_addr
sin_port。
IPv4地址和TCP或UDP端口号在套接字地址结构中总是以网络字节序来存储。
32位
IPv4地址存在两种不同的访问方法。如果
serv定义为某个套接字地址结构,那么
serv.sin_addr将按
in_addr结构引用其中的32位
IPv4地址,
serv.sin_addr.s_addr将按
in_addr_t引用同一个地址。
通用套接字地址结构
当作为一个参数传递进任何套接字函数时,套接字地址结构总是以引用形式(也就是指向该结构的指针)传递。然而以这样的指针为参数之一的任何套接字函数必须处理来自所支持的任何协议族的套接字地址结构。<sys/socket.h>头文件中定义了一个通用的套接字地址结构:
struct sockaddr { uint8_t sa_len; sa_family_t sa_family; // address family: AF_xxx value char sa_data[14]; // protocol-specifier address };
于是套接字函数被定义为以指向某个通用套接字地址结构的一个指针作为其参数之一,例如:
int bind(int, struct sockaddr*, socklen_t);
这就要求对这些函数的任何调用必须要将指向特定与协议的套接字地址结构的指针进行强制类型转换,变成指向某个通用套接字地址结构的指针。
IPv6套接字地址结构
新的通用套接字地址结构
值-结果参数
我们提到过,当向一个套接字函数传递一个套接字地址结构时,该结构总是以引用形式来传递,该结构的长度也作为一个参数来传递,不过其传递方式取决于该结构的传递方式:是从进程到内核,还是从内核到进程。* 从进程到内核传递套接字地址结构的函数有3个:
bind connect sendto。这些函数的一个参数是指向某个套接字地址结构的指针,另一个参数是该结构的整数大小。例如:
struct sockaddr_in serv; connet(sockfd, (struct sockaddr*)&serv, sizeof(serv));
从内核到进程传递套接字地址结构的函数有4个:
accept recvfrom getsockname getpeername,其中两个参数是指向某个套接字地址结构的指针和指向表示该结构大小的整数变量的指针。例如:
struct sockaddr_un cli; socklen_t len; len = sizeof(cli); getpeername(unixfd, (struct sockaddr*)&cli, &len);
字节排序函数
我们把某个给定系统所用的字节序称为主机字节序,host byte order。
#include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); // 均返回网络字节序 uint16_t ntohs(uint16_t net16bitvalue); uint32_t ntohl(uint32_t net16bitvalue); // 均返回主机字节序
我们应该把
s视为一个16位的值,例如
TCP或
UDP端口号,把
l视为一个32位的值,例如IPv4地址。
字节操纵函数
inet_aton inet_addr inet_ntoa函数
inet_pton和inet_ntop函数
#include <arpa/inet.h> int inet_pton(int family, const char* strptr, void* addrptr); const char* inet_ntop(int family, const void* addrptr, char* strptr, size_t len);
sock_ntop和相关函数
inet_ntop的一个基本问题是:它要求调用者传递一个指向某个二进制地址的指针,而该地址通常包含在一个套接字地址结构中
readn、writen和readline函数
89ad相关文章推荐
- 第三章 套接字编程简介
- 第三章 套接字编程简介
- 3. 套接字编程简介
- 套接字编程简介
- Unix网络编程学习笔记之第3章 套接字编程简介
- UNIX 网络编程笔记-CH3:套接字编程简介
- UNP函数笔记一: 套接字编程简介
- 套接字编程简介
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
- UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数
- 3 套接字编程简介
- 第三章 套接字编程简介
- 套接字编程简介
- Linux网络编程(一) 套接字编程简介
- 套接字编程简介<二>
- 套接字编程简介
- UNIX网络编程卷一 笔记 第三章 套接字编程简介
- (转)Linux网络编程(1):套接字编程简介
- Linux/UNIX网络编程笔记(二) 套接字编程简介
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介