基础API
- signal函数
#inculde<signal.h>
void (*signal(int signo, void (*func) (int))) (int);
- socket函数
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
// domain 底层协议族,PF_INET--> IPv4 ,PF_INET6-->IPv6
// type 服务类型 SOCK_STREAM流服务,SOCK_UGRAM数据报
// protocol 协议
- 地址
struct sockaddr_in {
sa_family_t sin_family; // 地址族:AF_INET
u_int16_t sin_port; //端口号,要用网络字节序
struct in_addr sin_addr; //IPv4地址结构体
};
struct in_addr {
u_int32_t s_addr; //IPv4地址,网络字节序表示
};
- IP地址转换
#include<arpa/inet.h>
int inet_pton( int af, const char* stc, void* dst );
const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);
inet_pton将字符串表示的IP地址src转换为网络字节序IP,并把结果存在dst指向的内存中。
inet_ntop相反
#include<arpa/inet.h>
in_addr_t inet_addr (const char* strptr);
int inet_aton(const char* cp, struct in_addr* inp);
char* inet_ntoa(struct in_addr in);
- 主机字节序与网络字节序
#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htonl(unsigned short int hostlong);
unsigned long int ntohl(unsigned long int hostlong);
unsigned short int ntohl(unsigned short int hostlong);
- bind
#include<sys/types.h>
#include<sys/socket.h>
int bind (int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
bind将mmy_addr所指的socket地址分配给为未命名的sockfd文件描述符.
errno99:绑定地址或端口有问题
- listen
#include<sys/scoket.h>
int listen(int sockfd, int backlog);
sockfd指定被监听socket。backlog指定监听最大长度。
- accept
#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t* addrlen);
sockfd是执行过listen系统调用的监听sockfd。accept只是从监听队列中取出连接,而不论连接处于何种状态,更不关心任何网络状况的变化。
- connect
#include<sys/types.h>
#include<sys/socket.h>
int connect (int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
- close
#include<unistd.h>
int clost(int fd);
close系统调用并非总是立即关闭一个连接,而是将fd的引用计数减1。当计数为0,才关闭。
立即终止使用shutdown
- TCP读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int sockfd, void* buf, size_t len, int flags);
ssize_t send(int sockfd, const void* buf, size_t len, int flags);
recv读取sockfd上的数据,buf和len分别指定缓冲区位置和大小。recv成功时返回读取的数据长度。flags额外控制。
- UDP读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int falgs, struct sockaddr* src_addr, socklen_t * addrlen);
ssize_t sendto(int sockfd, void *buf, size_t len, int falgs, cosnt struct sockaddr* dest_addr, socklen_t * addrlen));
- 通用数据读写函数
#include<sys/scoket.h>
ssize_t recvmsg(int sockfd, struct msghdr* msg, int flags);
ssize_t sendmsg(int scokfd,struct msghdr*msg, int flags);
struct msghsr {
void* msg_name:
socklen_t msg_namelen;
struct iovec* msg_iov;
int msg_iovlen;
void* msg_control;
socklen_t msg_controllen;
int msg_flags;
};
struct iovec {
void *iov_base;
size_t iov_len;
};
- 地址信息函数
#include<sys/socket.h>
int getsockname(int sockfd, stuct sockaddr* addresss, socklen_t * address_len);
int getpeername(int sockfd, stuct sockaddr* addresss, socklen_t * address_len);
getsockname获取sockfd对应的本端socket地址,并将其存储与addresss
getpeername获取sockfd对应的远端socket地址
- socket选项
#include<sys/socket.h>
int getscokopt(int sockfd, int level, int option_name,void *option_value, socklen_t* restrict option_len);
int setscokopt(int sockfd, int level, int option_name,const void *option_value, socklen_t* restrict option_len);
- SO_REUSEADDR 可以用来强制使用被处于TIME_WAIT状态的连接占用的socket地址
- SO_RCVBUF和SO_SNDBUF
- SO_RCVLOWAT和SO_SNDLOWAT
- SO_LINGER
- 网络信息API
- gethostbyname和gethostbuaddr
#include<netdb.h>
sturct hostent* gethostbyname(const char* name);
struct hostent* gethostbyaddr(const void* addr, size_t len, int type);
struct hosten {
char *h_name;
char** h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
- getservbyname和getservbyport
#include<netdb.h>
struct servent*getservbyname(const char* name, cosnt char* proto);
sturct servent* getservbyport(int port, const char* proto);
struct servent {
char* s_name;
char** s_aliases;
int s_port;
char *s_proto;
};
- getaddrinfo
#include<netdb.h>
int getaddrinfo(cosnt char* hostname, const char* service, cosnt struct addrinfo* hints, struct addrinfo** result);
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
char* ai_canonname;
struct sockaddr* ai_addr;
struct addrinfo* ai_next;
};
- getnameinfo
#include<netdb.h>
int getnameinfo(const struct sockaddr* sockaddr, socklen_t addrlen, char* host, socklen_t hostlen, char* serv, socklen_t servlen, int flags);