#include <sys/types.h>
#include <sys/socket.h>
函数原型:(创建一个套接口)
int socket(int family, // 协议类型,一般为AF_INET
int type, // socket类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET
int protocol // 用来指定socket所使用的传输协议编号,通常设为0即可,表示缺省
); // 若无错误发生,socket()返回引用新套接口的描述字; 否则,返回INVALID_SOCKET错误
#include <sys/types.h>
#include <sys/socket.h>
函数原型:(通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号))
int bind(int sockfd, // socket描述符
struct sockaddr *my_addr, // 是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针
int addrlen // 常被设为sizeof(struct sockaddr)
); // 返回:成功返回0,失败返回-1
#include <sys/socket.h>
函数原型:(创建一个套接字并监听申请的连接。仅适用于支持连接的套接口,如SOCK_STREAM类型的)
int listen(int sockfd, // socket()系统调用返回的socket描述符
int backlog // 指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
); // 如无错误发生,返回0;否则返回-1
#include <sys/types.h>
#include <sys/socket.h>
函数原型:
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
sockfd: 目的服务器的socket描述符
serv_addr:包含目的机器ip地址和端口号的指针
addrlen:sizeof(struct sockaddr)
#include <sys/types.h>
#inlcude <sys/socket.h>
函数原型:
int accept(int sockfd, void *addr, int addrlen)
sockfd:是被监听的socket描述符
addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
addrlen:sizeof(struct sockaddr_in)
#include <sys/socket.h>
函数原型:
int send(int sockfd, const void *msg, int len, int flags);
sockfd:用来传输数据的socket描述符
msg:要发送数据的指针
flags: 0
#include <sys/types.h>
#include <sys/socket.h>
函数原型:
int recv(int sockfd, void *buf, int len, unsigned int flags)
sockfd:接收数据的socket描述符
buf:存放数据的缓冲区
len:缓冲的长度
flags:0
read() write()
int read(int fd, char *buf, int len)
int write(int fd, char *buf, int len)
shutdown()
close(sockfd)
int shutdown(int sockfd, int how)
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t *addrlen);
// 成功则返回读、写的字节数,出错则为-1。
第一个参数sockfd:描述符;
第二个参数buff:指向读入或写出的缓冲区的指针;
第三个参数nbytes:读写字节数;
第四个参数flags:调用操作方式;
第五个参数from/to:指向数据报发送者或接收者的协议地址(如IP地址和端口号)的套接字地址结构;
第六个参数addrlen:from/to参数的大小。
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen); // 获取与某个套接字关联的本地协议地址
int getpeername(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen); // 获取与某个套接字关联的外地协议地址
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *string, struct in_addr*addr); // 字符串有效返回1,否则返回0
int inet_pton(int af, const char *src, void *dst); // 将“点分十进制”字符串 -> “二进制整数” 参数af为AF_INET或AF_INET6
char* inet_ntoa(struct in_addr in); // 返回点分十进制字符串
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
struct in_addr {
in_addr_t s_addr;
};
结构体in_addr 用来表示一个32位的IPv4地址。
in_addr_t 一般为 32位的unsigned int,其字节顺序为网络顺序,即该无符号整数采用大端字节序。
其中每8位代表一个IP地址位中的一个数值。
#include <sys/select.h>
int select(int maxfdpl, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
maxfdpl: 是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1。
readset: (可选)指针,指向一组等待可读性检查的套接口。
writeset: (可选)指针,指向一组等待可写性检查的套接口。
exceptset:(可选)指针,指向一组等待错误检查的套接口。
timeout: select()最多等待时间,对阻塞操作则为NULL。
函数返回:若有就绪描述符则为其数目;超时则为0;出错则为-1(如捕获到中断信号)。
#include <sys/epoll.h>
int epoll_create(int size);
// 创建一个epoll的句柄(epoll专用的文件描述符),size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event event); // 该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。
第一个参数epfd:是epoll_create()的返回值;
第二个参数op:表示动作(要进行的操作):EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;
第三个参数fd:是需要监听的fd;
第四个参数:是告诉内核需要监听什么事;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); // 等待事件的产生(用于轮询I/O事件的发生),类似于select()调用。
第一个参数epfd:由epoll_create 生成的epoll专用的文件描述符;
第二个参数events:用来从内核得到事件的集合;
第三个参数maxevents:表示每次能处理的最大事件数(其值不能大于创建epoll_create()时的size);
第四个参数timeout:是超时时间(毫秒,0会立即返回,-1永不超时,或是永久阻塞,直到有事件产生才触发)。
该函数返回需要处理的事件数目,返回0表示已超时,错误返回-1。
#include <signal.h>
signal(参数1,参数2);
参数1:处理的信号。系统的信号一般为宏定义。
参数2:处理的方式(是系统默认还是忽略还是捕获)。
例如signal(SIGINT ,SIG_ING);
SIG_ING 代表忽略SIGINT信号,SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。发送给所有ForeGround Group的进程。