一下内容记录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)