嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录

一、网络编程--OSI模型

二、网络编程--TCP/IP模型

三、网络接口

四、UDP网络相关编程及主要函数

​编辑​编辑 UDP的特征

socke函数

bind函数

recvfrom函数(接收函数)

sendto函数(发送函数)

五、网络编程之 UDP  用户数据报 

1、特性: 无链接  不可靠  大数据   

2、框架: C/S模式 

3、代码示例

一、网络编程--OSI模型

二、网络编程--TCP/IP模型

三、网络接口

四、UDP网络相关编程及主要函数

 
UDP的特征

服务端:提供网络服务

客户端:使用网络服务

在网络程序,是客户端找服务器,服务器不能找客户端,故服务端需使用bind来绑定端口号;

socke函数

 服务器端:

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

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

功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
                                       PF_UNIX == AF_UNIX ==>单机程序
           type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
                SOCK_DGRAM   用户数据报套接字===>UDP
                SOCK_RAW     原始套接字  ===》IP
      protocol 协议 ==》0 表示自动适应应用层协议。(前面已经描述清楚,TCP\UDP都填0)

返回值:成功 返回申请的套接字id,  失败  -1;

bind函数

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联, 用于从该接口接受数据。

      如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。

      注意:如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构
      {
          u_short sa_family;  地址族
          char sa_data[14];   地址信息
      };

      转换成网络地址结构如下:
      struct _sockaddr_in    ///网络地址结构
      {
          u_short           sin_family; 地址族
          u_short           sin_port;   ///地址端口,一般建议值大于50000,使用htons(host to net short),进行地址转换(将一个无符号短整型数值转换为网络字节序,即大端模式)
          struct in_addr  sin_addr;   ///地址IP,使用函数inet_addr(192.168.116.130);将字符串(小端)转为大端
          char               sin_zero[8]; 占位
      };

      struct in_addr
      {
          in_addr_t s_addr;
      }

      socklen_t addrlen: 参数2 的长度。
返回值:成功 0,失败  -1;

recvfrom函数(接收函数)

ssize_t recvfrom(int sockfd, void *buf, size_t len,             int flags,                          
                              收到buf     大小        一般默认为0 ,无人发送时阻塞
struct sockaddr *src_addr, socklen_t *addrlen);
    对方地址                   大小:int len = sizeof(cli);
                                    &len

接收函数:

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

功能:用于UDP协议中获取对方发送的数据。
参数:sockfd 本地的套接字id
      buff   要存储数据的内存区,一般是数组或者动态内存。
      len    要获取的数据长度,一般是buff的大小。
      flags  获取方式,0 阻塞

      src_addr 可选,表示对方的地址信息结构体,
                  如果为NULL,表示不关心对方地址。
      addrlen  对方地址信息结构体大小。
                  如果对方地址是NULL,则该值也为NULL。
返回值:成功 接收到的数据长度
        失败  -1;

sendto函数(发送函数)

ssize_t sendto(int sockfd, const char *buf, size_t len, int flags, 
                            发生buf内容
const struct sockaddr *dest_addr, socklen_t addrlen);
发给谁

发送函数:

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

功能:用于UDP协议中向对方发送数据。
参数:sockfd  本地的套接字id
      buff    本地的数据存储,一般是要发送的数据。
      len     要发送的数据长度
      flags   要发送数据方式,0 表示阻塞发送。

      dest_addr: 必选,表示要发送到的目标主机信息结构体。
      addrlen :目标地址长度。

返回值:成功  发送的数据长度, 失败   -1;

注意:对于客户端,ser内容保留,获取iP地址;
当谁回应是确定的,recvfrom的地址为null,大小也为null;
若完成,关闭套接字,close(); 

五、网络编程之 UDP  用户数据报 

1、特性: 无链接  不可靠  大数据   

2、框架: C/S模式 

   server:socket() ===>bind()===>recvfrom()===>close()
   client:socket() ===>bind()===>sendto() ===>close()

注意:socket()的参数需要调整。

      socket(PF_INET,SOCK_DGRAM,0);

      bind() 客户端是可选的,服务器端是比选的。

3、代码示例

服务端: 

 客户端:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值