目录
一.TCP网络编程
1.socket函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数功能:
创建套接字
函数原型:
int socket(int domain, int type, int protocol);
函数参数:
domain:通信域
AF_UNIX, AF_LOCAL 本地通信使用
AF_INET IPV4使用
AF_INET6 IPV6使用
AF_PACKET 原始套接字
type;类型
SOCK_STREAM TCP使用
SOCK_DGRAM UDP使用
SOCK_RAW 原始套接字使用
protocol:附加协议 一般传0即可
返回值:
成功 返回套接字
失败 返回-1,重置错误码
2.bind函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
功能:
将套接字与网课信息结构体绑定
函数原型:
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
函数参数:
sockfd:套接字
addr:网络信息结构体
/此结构体用于强转防止编译的警告/
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
}
/操作函数时用此结构体/
struct sockaddr_in{
sa_family_t sin_family; *通信域*
in_port_t sin_port; *端口号(网络字节序)*
struct in_addr sin_addr; *网络地址*
};
addrlen:addr结构体的大小
返回值:
成功 返回0
失败 返回-1 重置错误码
3.listen函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数功能:
将套接字设置成被动监听状态
函数原型:
int listen(int sockfd, int backlog);
函数参数:
sockfd:套接字
backlog:半侦听队列的长度
一般设置为5,10,不等于0即可
返回值:
成功 返回0
失败 返回-1,重置错误码
4.accept函数
头文件:
#include <sys/socket.h>
函数功能:
阻塞等待挂起队列的第一个连接,连接成功会返回一个新的套接字与当前客户端通信
函数原型:
int accept(int socket, struct sockaddr * address,socklen_t * address_len);
函数参数:
socket:套接字 ---已经 bind 和listen 成功的
address:用于保存客户端信息的缓冲区的首地址,不关心客户端信息则传NULL
address_len:address大小,不关心可以传NULL
返回值:
成功 返回新的套接字
失败 返回-1,重置错误码
5.connect函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数功能:
与服务器建立连接
函数原型:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
函数参数:
sockfd:套接字
addr:将要连接服务器的网络信息结构体
addrlen:addr大小
返回值:
成功 返回0
失败 返回-1,重置错误码
6.send函数(收发数据函数)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数功能:
向套接字上发送一条消息
函数原型:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
函数参数:
sockfd:套接字
buf:要发送的数据首地址
len:要发送的字节数
flags:接收的标志位 如果是 MSG_DONTWAIT 表示非阻塞,如果没有任何标志位 flag可以置0
返回值:
成功 返回实际发送的数据字节数
失败 返回-1 重置错误码
如果对方套接字已经关闭,第一次关闭send会成功,第二次send会产生一个SIGPIPE信号
7.recv函数(收发数据函数)
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数功能:
在套接字上接收一条消息
函数原型:
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
函数参数:
sockfd:套接字
buf:用来保存接收的信息的缓冲区的首地址
len:想要接收的字节数
flags:接收的标志位 如果是 MSG_DONTWAIT 表示非阻塞,如果没有任何标志位 flag可以置0
返回值:
成功 返回实际接收的数据的字节数
失败 -1 重置错误码
如果对方套接字已经关闭或者连接断开,recv会返回0
二、UDP网络编程
1.sendto函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数功能:
向套接字上发送一条消息
函数原型:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
函数参数:
(与send函数参数相同)
sockfd:套接字
buf:将要发送的数据首地址
len:发送的字节数
flags:接收的标志位 如果是 MSG_DONTWAIT 表示非阻塞
如果没有任何标志位 flag可以置0
(与accept后两项函数参数相同)
addr:address:用于保存客户端信息的缓冲区的首地址,不关心客户端信息则传NULL
addrlen:address大小,不关心可以传NULL
返回值:
成功 返回实际发送数据的字节数
失败 返回-1,重置错误码
2.recvfrom函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数功能:
在套接字上接收一条消息
函数原型:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
函数参数:
(与recv函数参数相同)
sockfd:套接字
buf:保存接收信息缓冲区的首地址
len:想要接收的字节数
flags:接收的标志位 如果是 MSG_DONTWAIT 表示非阻塞
如果没有任何标志位 flag可以置0
(与connect函数后两个参数相同)
addr:连接的服务器网课信息结构体
addrlen:addr的大小
返回值:
成功 返回实际接收的数据的字节数
失败 返回-1 重置错误码
recvfrom不会返回0
三、非阻塞IO
头文件:
#include <unistd.h>
#include <fcntl.h>
函数功能:
控制文件描述符
函数原型:
int fcntl(int fd, int cmd, ... /* arg */ );
函数参数:
fd:要控制的文件描述符
cmd:命令
F_GETFL 获取文件描述符的状态
F_SETFL 设置文件描述符的状态
(文件描述的状态中 O_NONBLOCK 表示非阻塞)
...:可变参
如果cmd是F_GETFL 第三个参数被忽略
如果cmd是F_SETFL 第三个参数是一个int类型
函数返回值:
如果cmd是F_GETFL 成功返回文件描述符的状态 失败-1 重置错误码
如果cmd是F_SETFL 成功 0 失败 -1 重置错误码
用法:例子(使用fcntl 设置文件描述符 非阻塞状态)
int flag = fcntl(fd,F_GETFL)//先获取原有的状态
flag |= O_NONBLOCK//添加非阻塞标志位
fcntl(fd,F_SETFL,flag)//重新设置
四、多路IO复用
1.select函数
头文件:
#include <sys/select.h>
函数功能:
实现多路IO复用
函数原型:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
函数参数:
nfds:要监视的最大的文件描述符 +1
readfds:要监视的读文件描述符集合 如果不关心 可以传 NULL
writefds:要监视的写文件描述符集合 如果不关心 可以传 NULL
exceptfds:要监视的异常文件描述符集合 如果不关心 可以传 NULL
timeout:超时时间 如果是 NULL 表示永久阻塞
返回值:
成功 返回就绪的文件描述符的个数
失败 -1 重置错误码
超时 0
用于操作集合的四个宏
void FD_CLR(int fd, fd_set *set); //将文件描述符从集合中删除
int FD_ISSET(int fd, fd_set *set); //判断文件描述符是否还在集合中
// 返回 0 不在了 返回非0 还在
void FD_SET(int fd, fd_set *set); //将文件描述符添加到集合中
void FD_ZERO(fd_set *set); //将文件描述符集合清空