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)