您的位置:首页 > 编程语言

套接字编程简介

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: