linux网络编程(8)UDP编程模型与数据收发系统调用

UDP编程模型
比较TCP编程模型,UDP编程模型中服务器端不需要listen和accept,而是通过readfrom阻塞等待用户请求,UDP编程模型中的客户端不再需要connect服务器,只需要bind套接字与IP即可,当然bind也不是必须要有的。

UDP编程步骤

1、服务器:
1) 在内核中创建结构体struct socket
2) 用户空间中创建地址结构体struct sockaddr_in
3) 往地址结构体中加入ip和port并要将其转成网络字节序
4) 将struct socket和struct sockadd_in进行绑定(bind)
5) 接受来自客户端的报文(recvfrom)
6) 处理客户端的报文并返回信息给客户端(sendto)

7) 关闭资源 

2、客户端:
1) 在内核中创建结构体struct socket
2) 用户空间中创建地址结构体struct sockadd_in
3) 往地址结构体中加入服务器的ip和port并要将其转成网络字节序
4) 发送数据给服务器(sendto)
5) 接受来自服务器返回的数据(recv)

6) 关闭资源 

数据传输系统调用:

注意:

1.发送数据报文

#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t nbytes, int flag);

返回:成功返回发送字节数,出错返回-1

ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flag, const struct sockaddr *destaddr, socklen_t destlen);

返回:成功返回发送字节数,出错返回-1

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flag);

返回:成功返回发送字节数,出错返回-1

2.接收数据报文

#include <sys/socket.h>
ssize_t recv(int sockfd, const void *buf, size_t nbytes, int flag);

返回:成功返回发送字节数,出错返回-1

ssize_t recvfrom(int sockfd, const void *buf, size_t nbytes, int flag, const struct sockaddr *destaddr, socklen_t destlen);

返回:成功返回发送字节数,出错返回-1

ssize_t recvmsg(int sockfd, const struct msghdr *msg, int flag);

返回:成功返回发送字节数,出错返回-1


注意:上面的函数默认阻塞读写,可通过信号量设置超时或者在套接字选项中设置超时控制。

猜你喜欢

转载自blog.csdn.net/weicao1990/article/details/80783753