1. 程式人生 > >linux網路程式設計基礎API(一)

linux網路程式設計基礎API(一)

一下內容記錄linux網路程式設計基礎內容:

1、套接字地址結構

ipv4套接字地址結構:struct sockaddr_in,定義在<netinet/in.h>,

ipv6套接字地址結構:struct sockaddr_in6,同樣定義在<netinet/in.h>

通用套接字地址結構:struct sockaddr,定義在<sys/socket.h>

ipv4和ipv6套接字地址分別用在定義他們時,而通用套接字用於套接字函式,需要強制型別轉換。

新的通用套接字地址結構struct  sockaddr_storage還沒用過,用到時再補充吧。

如上地址中的成員包括16為的埠號和32位的IPV4地址,而都需要使用網路位元組序,以下為網路位元組序和主機位元組序的轉換:

 <netinet/in.h>,h:host    n:network   s:short   l:long

uint16_t htons(uint16_t host16bitvalue)

uint32_t htonl(uint32_t host16bitvalue)

uint16_t ntohs(uint16_t host16bitvalue)

uint32_t ntohl(uint32_t host16bitvalue)

 

2、位元組操縱函式

<strings.h> void bzero(void *dest, size_t nbytes),bzero把目標字串中指定數目的位元組置為0.

<string.h> void *memset(void *dest, int c, size_t len), memset把目標字串中指定數目的位元組置為c。

3、轉換函式

 <apra/inet.h>,一下均用於ipv4

int inet_aton(const char *strptr, struct in_addr *addrptr),將strptr所指的C字串轉換成一個32位的網路位元組序二進位制值,存放在addrptr。

in_addr_t inet_addr(const char *strptr),同上,返回該32位值。已被棄用。

char *inet_ntoa(struct in_addr inaddr),將一個32位的網路位元組序二進位制ipv4地址轉換成相應的點分十進位制數串。

<arpa/inet.h>, 適用於ipv4和ipv6

int inet_pton(int family, const char *strptr, void *addrptr),family指定是AF_INET | AF_INET6,從表示式格式strptr轉化為數值格式addrptr。

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len),family同上,len為目標儲存大小,從數值addrptr轉化為表示式格式strptr。

4、基本TCP套接字函式

<sys/socket.h>

int socket(int family, int type, int protocal)

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)

int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)

int listen(int sockfd, int backlog)

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)

int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen),返回socket關聯的本地協議地址。

int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen),返回socket關聯的外地協議地址。

<unistd.h>

int read(int handle, void *buf, int nbyte)

int write(int handle, void *buf, int nbyte)

int close(int sockfd)