套接字编程简介

来源:互联网 发布:ppt倒计时软件 编辑:程序博客网 时间:2024/05/27 00:50

套接字地址结构

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位的值,例如TCPUDP端口号,把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函数

0 0
原创粉丝点击