【网络编程】使用函数汇总总结

         记录自己学习,如果对你有帮助,可以一起学习进步,太多要用的函数了,记不住根本记不住,基本上是TCP、UDP之间的通信相关的一些函数

目录

1、htonl、htons:主机字节序和网络字节序的相互转换函数

2、ntohl、ntohs:网络字节序转换成主机字节序

3、inet_addr:将点分十进制转换成网络字节序

4、inet_ntoa:将网络字节序转换成点分十进制

5、socket函数:为通信创建一个端点,并返回该端点的文件描述符

6、bind函数:将一个套接字绑定到特定的网络地址和端口号上

7、listen函数:将套接字设置成被动监听状态,接受客户端的连接请求

8、accept:用于阻塞接收客户端连接请求

9、connect:将套接字文件描述符连接到addr指向的地址空间中

11、recv:从套接字中读取数据到buf中

12、sendto:向套接字文件描述符中读取数据,写给指定的对端接收

13、recvfrom:从套接字文件描述符中读取数据,并将对端地址信息结构体接收

14、getsockopt、setsockopt套接字属性的获取和设置


1、htonl、htons:主机字节序和网络字节序的相互转换函数

函数原型:

1、uint32_t htonl(uint32_t hostlong);    //将4字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序
 
2、uint16_t htons(uint16_t hostshort);   //将2字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序

功能:将主机字节序转换成网络字节序


2、ntohl、ntohs:网络字节序转换成主机字节序

函数原型:

1、uint32_t ntohl(uint32_t netlong);    //将4字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
 
2、uint16_t ntohs(uint16_t netshort);     //将2字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序

功能:将网络字节序转换成主机字节序


3、inet_addr:将点分十进制转换成网络字节序

函数原型:

in_addr_t inet_addr(const char *cp); 

 功能:将点分十进制转换成网络字节序

参数:点分十进制

返回值:网络字节序


4、inet_ntoa:将网络字节序转换成点分十进制

函数原型:

 char *inet_ntoa(struct in_addr in); 

功能:将网络字节序转换成点分十进制

参数:网络字节序

返回值:点分十进制


5、socket函数:为通信创建一个端点,并返回该端点的文件描述符

函数原型:

int socket(int domain, int type, int protocol);

功能:为通信创建一个端点,并返回该端点的文件描述符

参数1:通信域

AF_UNIX, AF_LOCAL   本地通信,同一主机之间进程通信     详情请看man 7 unix
AF_INET             IPv4 提供的网络通信               详情请看man 7 ip
AF_INET6            IPv6 提供的网络通信               详情请看man 7 ipv6

 参数2:指定通信语义,可以由多个宏值使用位或连接

SOCK_STREAM:表示提供TCP协议的传输方式
SOCK_DGRAM:表示提供UDP协议的传输方式
SOCK_NONBLOCK:套接字设置非阻塞属性

参数3: 如果参数2中仅仅指定一个协议,那么参数3可以填0,如果指定多个,则参数3需要指定特定的协议

TCP协议名称:IPPROTO_TCP
UDP协议名称:IPPROTO_UDP

例子:

int sfd = socket(AF_INET, SOCK_STREAM, 0);
//参数1:表示ipv4的网络通信
//参数2:表示使用的是TCP通信方式
//参数3:表示默认使用一个协议

返回值:成功返回创建的套接字文件描述符,失败返回     -1并置位错误码


6、bind函数:将一个套接字绑定到特定的网络地址和端口号上

函数原型:

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

 功能:将一个套接字绑定到特定的网络地址和端口号上

参数1:​通过socket函数创建出来的套接字文件描述符

参数2:通用地址信息结构体,需要根据具体使用的地址族而定, struct sockaddr仅仅只是为了类型的强制转换,防止出现警告

参数3:参数2的大小

例子:

struct sockaddr_in sin;       
sin.sin_family = AF_INET;       //通信域
sin.sin_port = htons(SER_PORT);    //端口号
sin.sin_addr.s_addr = inet_addr(SER_IP);    //ip地址
 
//2.2 绑定工作
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
    perror("bind error");
	return -1;
}

返回值:成功返回0,失败返回-1并置位错误码


7、listen函数:将套接字设置成被动监听状态,接受客户端的连接请求

函数原型:

int listen(int sockfd, int backlog);

功能:

参数1:套接字文件描述符

参数2:容纳连接的队列的最大长度,一般填128

例子:

//3、将套接字设置成被动监听状态
if(listen(sfd, 128)==-1)
{
	perror("listen error");
	return -1;
}

返回值:成功返回0,失败返回-1并置为错误码


8、accept:用于阻塞接收客户端连接请求

函数原型:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:​用于阻塞接收客户端连接请求

参数1:服务器套接字文件描述符

参数2:用于接收对端地址信息结构体的指针

参数3:接收对端地址信息的长度

例子:

//4、阻塞等待客户端的连接请求
//4.1 定义变量用于接收客户端的信息
struct sockaddr_in cin;          //用于接收地址信息
socklen_t addrlen = sizeof(cin);  //用于接收长度
	
//4.2 接收连接
int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen) ;
if(newfd == -1)
{
	perror("accept error");
	return -1;
}

返回值:成功返回一个新的用于通信的套接字文件描述符,失败返回-1并置位错误码


9、connect:将套接字文件描述符连接到addr指向的地址空间中

函数原型:

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:将套接字文件描述符连接到addr指向的地址空间中

参数1:客户端套接字文件描述符

参数2:对端地址信息结构体

参数3:参数2的大小

例子:

//3、连接到服务器
//3.1 填充服务器地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;          //通信域
sin.sin_port = htons(SER_PORT);      //服务器端口号
sin.sin_addr.s_addr = inet_addr(SER_IP);     //服务器ip地址
 
//3.2 连接服务器
if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
	perror("connect error");
	return -1;
}

返回值:成功返回0,失败返回-1并置位错误码


10、send:向通信套接字文件描述符中写入数据

函数原型:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

功能:向通信套接字文件描述符中写入数据

参数1:通信的套接字文件描述符

参数2:要发送数据的起始地址

参数3:要发送数据的大小

参数4:是否阻塞接收

0:表示阻塞接收消息
MSG_DONTWAIT:表示非阻塞接收数据

例子: 

send(cfd, buf, strlen(buf), 0);

返回值:成功返回发送字符的个数,失败返回-1并置位错误码      


11、recv:从套接字中读取数据到buf中

函数原型:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

功能:从套接字中读取数据到buf中

参数1:用于通信的套接字文件描述符

参数2:接收数据后的容器地址

参数3:接收的数据的大小

参数4:是否阻塞接收

0:表示阻塞接收消息
MSG_DONTWAIT:表示非阻塞接收数据

例子:

int res = recv(newfd, buf, sizeof(buf), 0);

返回值:

>0:表示成功读取的字符个数
=0:表示通信对端已经下线
=-1:表示出错,置位错误码 


12、sendto:向套接字文件描述符中读取数据,写给指定的对端接收

函数原型:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

功能:向套接字文件描述符中读取数据,写给指定的对端接收

参数1:套接字文件描述符

参数2:要发送数据的起始地址

参数3:要发送的数据大小

参数4:是否阻塞,0表示阻塞,MSG_NOWAIT表示非阻塞

参数5:接收对端地址信息结构体

参数6:参数5的大小

例子:

sendto(sfd, buf, strlen(buf), 0, (struct sockaddr*)&cin, sizeof(cin));

返回值:成功返回发送的字节的大小,失败返回-1并置位错误码


13、recvfrom:从套接字文件描述符中读取数据,并将对端地址信息结构体接收

函数原型:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

功能:从套接字文件描述符中读取数据,并将对端地址信息结构体接收

参数1:套接字文件描述符

参数2:要接收数据的起始地址

参数3:要接收的数据大小

参数4:是否阻塞,0表示阻塞,MSG_NOWAIT表示非阻塞

参数5:接收对端地址信息结构体

参数6:参数5的大小

例子:

recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);

返回值:成功返回读取的字节的大小,失败返回-1并置位错误码


14、getsockopt、setsockopt套接字属性的获取和设置

函数原型:

int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

功能:设置套接字在不同层上的属性

参数1:套接字文件描述符

参数2:要设置的层

应用层:SOL_SOCKET

传输层:  tcp传输:IPPROTO_TCP

                udp传输:IPPROTO_UDP

网络层: IPPROTO_IP

参数3:要设置当前层的属性名称 ,常用每层属性见下表

参数4:要设置或者获取属性的值 ,一般为int类型

参数5:参数4的大小

例子:

//2、获取套接字地址重用的值
int get_val = 1;
socklen_t size = sizeof(get_val);       //获取属性值的大小
if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &get_val, &size) == -1)
{
    perror("getsockopt error");
    return -1;
}
printf("get_val = %d\n", get_val);              //如果结果为0,表示套接字默认不允许端口号快速重用

//3、设置允许端口号快速重用
int set_val = 1;
if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &set_val, sizeof(set_val)) ==-1)
{
    perror("setsockopt error");
    return -1;
}
printf("端口号快速重用成功\n");

返回值:成功 返回0,失败返回-1并置位错误码

你可能感兴趣的:(知识点汇总,网络,udp,c语言,linux,网络编程)