POSIX规范只要求3个字段:sin_family、sin_addr和sin_port。
#include <netinet/in.h>
struct sockaddr_in
{
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
...
};
#include <sys/socket.h>
struct sockaddr
{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
术语“小端”和“大端”表示多个字节值的哪一端存储在该值的起始地址。网际协议使用大端字节序来传送这些多字节整数。
#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 net32bitvalue);
在那些与网际协议所用的大端字节序相同的系统中,这四个函数通常被定义为空宏。
#include <arpa/inet.h>
int inet_aton(const char* strptr, struct in_addr* addrptr);//字符串有效返回1,否则为0
in_addr_t inet_addr(const char* strptr);//字符串有效返回网络字节序的32位IPv4地址,否则为INADDR_NONE
char* inet_ntoa(struct in_addr inaddr);//指向一个点分十进制数串的指针
#include <arpa/inet.h>
int inet_pton(int family, const char* strptr, void* addrptr);//成功:1;输入格式无效:0;出错:-1
const char* inet_ntop(int family, const void* addrptr, char* strptr, size_t len);//失败:NULL;成功:结果
#include <netinet.in.h>
#define INET_ADDRSTRLEN 16
字节流套接字上调用read或write输入或输出的字节数可能比请求的数量少,原因在于套接字的缓冲器可能已经达到了极限,需要再次调用read或write输入或输出剩余的字节。对于文本行交互的应用来说,程序应该按照操作缓冲区来编写。