网络编程:重要函数总结

目录

一.TCP网络编程

1.socket函数

2.bind函数

3.listen函数

4.accept函数

5.connect函数

6.send函数(收发数据函数)

7.recv函数(收发数据函数)

二、UDP网络编程

1.sendto函数

2.recvrom函数

三、非阻塞IO

四、多路IO复用

1.select函数


一.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);			//将文件描述符集合清空

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值