-
int socket(int af,int type,int protocol)–用于创建一个套接字
返回值:成功时返回一个全新的文件描述符,失败时返回-1
af(address family):ip地址类型,常用宏AF_INET(ipv4),AF_INET6(ipv6)
type:创建的套接字的类型,常用SOCK_STREAM(流式套接字),SOCK_DGRAM(数据报套接字)
protocol:表示传输协议,常用IPPROTO_TCP(TCP协议)和IPPROTO_UDP(UDP协议),使用过程中一般填0,除非有两种不同的协议支持同一种地址类型和数据传输类型。 -
int bind(int sockfd,const struct sockaddr * addr,socklen_t addrlen)–用于服务器端,为套接字绑定网络地址和端口号
返回值:函数执行成功返回0,否则返回-1, 并设置错误代码。
sockfd:需要绑定的套接字文件描述符。
addr:存入网络类型,网络地址和端口号的结构体。
addrlen:addr结构体的长度。注:在实际中,我们通常将struct sockaddr_in这个结构体强转为strcut sockaddr使用
struct sockaddr_in
{
sa_family_t sin_family; //地址类型
uint16_t sin_port; //16位TCP/UDP端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8];//保留不使用
}
struct in_addr
{
In_addr_t s_addr; //32位IPv4地址
}
绑定时常用转换函数:
htons(host to unsigned short)和htonl(host to unsigned long)
htons用于将unsigned long的数值从小端转换为大端,long有4字节,常用于ipv4地址的转换。
u_short htons( u_short hostshort);
u_long htonl( u_long hostlong);
inet_addr和inet_ntoa
inet_addr用于将ipv4格式的字符串转换为unsigned long的数值。inet_ntoa用于将struct in_addr的地址转换为ipv4格式的字符串。
unsigned long inet_addr( const char* cp);
char* FAR inet_ntoa( struct in_addr in);
INADDR_ANY宏
用INADDR_ANY来配置IP地址,意味着不需要知道当前服务器的IP地址。对于多网卡的服务器,INADDR_ANY允许你的服务接收一个服务器上所有网卡发来的数据。下面例子也有写,如果某个socket使用INADDR_ANY和8000端口,那么它将接收该所有网卡传来的数据。而其他socket将无法再使用8000端口。
-
int listen(int fd, int backlog)–将一个套接字设为监听套接字,使其能够自动接收到来的连接并且为连接队列指定一个长度限制,
SOCK_STREAM或SOCK_SEQPACKET 类型的套接字。
返回值:函数执行成功时返回0.错误时返回-1,并置相应错误代码.
fd:要设置为监听模式的套接字文件描述符。
backlog:指定未完成连接队列的最大长度.如果一个连接请求到达时未完成连接队列已满,那么客户端将接收到错误ECONNREFUSED. -
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)–与让目标套接字与指定的网络地址和端口号连接
返回值:函数执行成功返回0,否则返回-1, 并设置错误代码。
sockfd:可供连接的套接字文件描述符
addr:用于填写连接目标的网络信息的结构体(参考bind下的使用)
addrlen:addr结构体长度 -
int accept(int fd, struct sockaddr *addr, socklen_t *addrlen)–用于基于连接的套接字,它从未完成连接队列中取出第一个连接请求,创建一个和参数fd
属性相同的连接套接字,并为这个套接字分配一个文件描述符,然后以这个描述符返回
返回值:若成功则返回一个非负整数标识这个连接套接字,发生错误时返回-1。
fd:一个正在用于监听功能下的套接字的文件描述符。
addr:用于储存接受到的客户端的网络信息的结构体(参考bind下的使用)
addrlen:addr结构体长度 -
int close(int fd)–立即关闭一个文件描述符,减少资源的开销
返回值:返回 0 表示成功, 或者-1 表示有错误发生。
fd:要关闭的文件描述符 -
int fcntl(int fd, int cmd, … /* arg */ )–控制一个文件描述符的相关属性
返回值:如果出错,所有命令都返回-1,如果成功则返回某个其他值。下列
四个命令有特定返回值:F_DUPFD、F_GETFD、F_GETFL、F_GETOWN。
第一个返回新的文件描述符,接下来的两个返回相应标志,最后一个返回一个正的进程ID或负的进程组ID。
fd:想要改变设置的文件描述符
cmd:代表想要操作的命令–
1)复制一个现有的描述符(cmd=F_DUPFD).
2)获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
3)获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).
4)获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).
5)获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW).
arg:相应命令下的属性参数 -
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen)–向指定地址端口发送信息
返回值:成功时返回发送的字符数,错误时返回-1,并置相应错误代码。
sockfd:用于发送数据的套接字的文件描述符。
buf:待发送数据的缓冲区
len:缓冲区长度
flags:调用方式标志位, 一般为0, 改变Flags,将会改变Sendto发送的形式
dest_addr:数据接收方的网络信息,如果sokcfd为SOCK_STREAM或SOCK_SEQPACKET属性时,此项可忽略
addrlen:dest_addr的长度,如果sokcfd为SOCK_STREAM或SOCK_SEQPACKET属性时,此项可忽略 -
ssize_t send(int sockfd, const void *buf, size_t len, int flags)–向已连接的套接字发送数据
返回值:成功时返回发送的字符数,错误时返回-1,并置相应错误代码。
sockfd:用于发送数据的套接字的文件描述符。
buf:待发送数据的缓冲区
len:缓冲区长度
flags:调用方式标志位, 一般为0, 改变Flags,将会改变Send发送的形式 -
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen)–从指定地址端口接收数据
返回值:接收成功时返回接收到的字节数,接收失败时返回-1,并设置错误代码。
sockfd:用于接收数据的套接字的文件描述符
buf:接收到的数据的缓冲区
len:缓冲区长度
flags:调用操作方式
src_addr:用于存放数据发送方的网络信息的结构体。
addrlen:结构体长度 -
ssize_t recv(int sockfd, void *buf, size_t len, int flags)–从已连接的套接字中接受数据
返回值:接收成功时返回接收到的字节数,接收失败时返回-1,并设置错误代码。当发送端数据发送完毕断开时,返回0。
sockfd:已连接的用于接收数据的套接字的文件描述符
buf:待接收数据的缓冲区
len:缓冲区长度
flags:调用操作方式 -
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)–可以获得一个与socket相关的地址。服务器端可以通过它得到相关客户端地址。
而客户端也可以得到当前已连接成功的socket的ip和端口。
返回值:成功时返回0,失败时返回-1,并设置相应错误代码。
sockfd:需要获取名称的套接字
addr:存放所获取套接字名称的缓冲区
addrlen:作为入口参数,name指向空间的最大长度。作为出口参数,name的实际长度 -
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen)–设置某个套接字选项
返回值:成功时返回0,失败时返回-1,并设置错误代码。
sock:要设置的套接字对象描述符
level:选项所在的协议层
optname:需要设置的选项名
optval:指向包含新选项值的缓冲
optlen:现选项的长度level常用宏:1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项. -
int shutdown(int sockfd,int how)–禁止在一个套接口上进行数据的接收与发送。
返回值:成功则返回0,错误返回-1,错误码errno
sockfd:要设置的套接字对象描述符
how:SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。
SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。
SHUT_RDWR(2):关闭sockfd的读写功能。 -
int epoll_create(int size)–该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。
返回值:返回一个监听队列的文件描述符
size:队列能关注的最大fd数 -
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)–该函数用于控制某个epoll文件描述符上的事件,可以注册事件,修改事件,删除事件。
返回值:成功时返回0,失败时返回-1,并设置相应错误代码。
epfd:由 epoll_create 生成的epoll专用的文件描述符。
op:要进行的操作例如注册事件,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 删除
fd:关联的文件描述符
event:指向epoll_event的指针,内核需要监听的事件
struct epoll_event
{
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
typedef union epoll_data
{
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
events可以是以下几个宏的集合:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
- int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)–该函数用于轮询I/O事件的发生;
返回值:返回发生的事件的个数
epfd:由epoll_create 生成的epoll专用的文件描述符;
events:events则是分配好的 epoll_event结构体数组,epoll将会把发生的事件复制到 events数组中
maxevents:表示本次可以返回的最大事件数目,通常 maxevents参数与预分配的events数组的大小是相等的
timeout:在没有检测到事件发生时最多等待的时间(毫秒),-1,相当于阻塞,0相当于非阻塞。