1. 程式人生 > >網絡編程常用結構與函數

網絡編程常用結構與函數

通過 否則 code 返回值 efi bytes inet_ntop const ipv4地址

IPv4套接字地址結構:sockaddr_in

#include <netinet/in.h>

struct in_addr {
    in_addr_t s_addr;     // 32-bit IPv4地址,網絡字節序
};

struct sockaddr_in {
    uint8_t          sin_len;       // 結構長度
    sa_family_t      sin_family;    // AF_INET
    in_port_t        sin_port;      // 16-bit TCP/UDP 端口號,網絡字節序
    struct
in_addr sin_addr; char sin_zero[8]; // unused };

通用套接字地址結構:sockaddr

用於聲明將套接字地址結構作為一個參數傳遞進任何套接字函數時所傳遞的指針的數據類型
對於開發者而言,這些通用套接字地址結構的唯一用途是:對指向特定於協議的套接字地址
結構的指針執行類型強制轉換

#include <sys/socket.h>

struct sockaddr {
    uint8_t       sa_len;
    sa_family_t   sa_family;    
    
char sa_data[14]; };

IPv6套接字地址結構:sockaddr_in6

#include <netinet/in.h>

struct in6_addr {
    uint8_t s6_addr[16];    // 128-bit IPv6地址,網絡字節序
};

#define SIN6_LEN           

struct sockaddr_in6 {
    uint8_t          sin6_len;         
    sa_family_t      sin6_family;      // AF_INET6
    in_port_t        sin6_port;         
    uint32_t         sin6_flowinfo;    
// 流信息 struct in6_addr sin6_addr; uint32_t sin6_scope_id; // 為scope設置接口 };

新的通用套接字地址結構:sockaddr_storage

#include <netinet/in.h>

struct sockaddr_storage {
    uint8_t      ss_len;
    sa_family_t  ss_family;
};

主機(h)字節序和網絡(n)字節序之間相互轉換的函數:

#include <netinet/in.h>

uint16_t htons(uint16_t host16bitvalue);    // 返回網絡字節序值

uint32_t htons(uint16_t host32bitvalue);    // 返回網絡字節序值

uint16_t ntohs(uint16_t net16bitvalue);    // 返回網絡字節序值

uint32_t ntohs(uint32_t net16bitvalue);    // 返回主機字節序值

字節操縱函數:

//源自Berkeley

#include <strings.h>

// 將自dest所指位置開始的nbytes個字節置0
void bzero(void *dest, size_t nbytes);          

// 將自src所指位置開始的nbytes個字節復制到的dest所指的位置
void bcopy(const void *src, void *dest, size_t nbytes);   

// 比較ptr1與ptr2所指位置開始的nbytes字節是否相等,若相等則返回0,否則返回非0
int bcmp(const void *ptr1, const * ptr2, size_t nbytes); 
//ANSI C函數

#include <string.h>

// 將目標字符串dest指定數目len的字節置為值c
void *memset(void *dest, int c, size_t len);

// 將自src所指位置開始的nbytes個字節復制到的dest所指的位置
void *memcpy(void *dest, const void *src, size_t nbytes);

// 比較ptr1與ptr2所指位置開始的nbytes字節是否相等,若相等則返回0,否則返回非0
int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);

適用於IPv4的地址轉換函數

#include <arpa/inet.h>

// 將strptr所指的C字符串轉換成一個32位的網絡字節序二進制值,並存儲在addrptr中
//若字符有效則返回1,否則為0
int inet_aton(const char *strptr, struct in_addr *addrptr);

// 將strptr所指的C字符串轉換成一個32位的網絡字節序二進制值,並作為返回值返回
// 此函數目前已被廢棄
in_addr_t inet_addr(const char *strptr);

// 將一個32位的網絡字節序二進制IPV4地址轉換成相應的點分十進制數串,並返回它的指針
char *inet_ntoa(struct in_addr inaddr);

對於IPv4和IPv6都適用

#include <arpa/inet.h>

// 嘗試轉換有strptr指針所指的字符串,並通過addrptr存放二進制結果
// 若成功則返回1,若strptr所指字符串不是有效的表達式格式,返回0,出錯返回-1
int inet_pton(int family, const char *strptr, void *addrptr);

// 將一個網絡字節序二進制地址轉換成相應的點分十進制數串,並返回它的指針,出錯返回NULL
// 調用者必須為strptr分配內存,strptr不能是一個空指針,當調用成功時,這個指針就是該函數的返回值
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

網絡編程常用結構與函數