UDP

UDP的特点:
1.UDP是无连接的,通信是不需要创建连接。
2.UDP采用了最大努力交付,不保证可靠交付。
3.UDP是面向报文,无阻塞控制。
4.UDP支持一对一,一对多,多对一,多对多的交互通信。

UDP的编程框架
在这里插入图片描述
通过服务器和客户机端对UDP通信进行描述:

UDP服务器端编程:
1.创建socket,使用函数socket();
2.绑定端口号,IP地址,使用函数bind();
3.在循环里面接收数据,使用函数recvfrom();
4.关闭网络连接。

UDP客户端编程:
1.创建socket,使用socket();
2.绑定端口号,IP地址,使用函数bind();*可选
3.设置对方的IP地址和端口号等信息。
4.发送数据,使用函数sendto();
5.关闭网络连接。

代码实例:

/*server*/
#include<signal.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
    struct sockaddr_in addr;
    char r_buf[100];
    char s_buf[100];
    int len = sizeof(addr);
    //创建socket描述符
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    perror("socket");
    addr.sin_family = AF_INET;
    //填充端口号
    addr.sin_port = htons(6789);
    //填充IP地址
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //绑定
    bind(sock,(struct sockaddr *)&addr,len);
    perror("bind");
    while(1)
    {
        memset(r_buf,0,sizeof(r_buf));
        //接收数据
        recvfrom(sock,r_buf,sizeof(r_buf),0,(struct sockaddr *)&addr,&len);
        printf("client: port = %d\n",ntohs(addr.sin_port));
        printf("server: r_buf = %s\n",r_buf);
        memset(s_buf,0,100);
        printf("server: send\n");
        fgets(s_buf,sizeof(s_buf),stdin);
        //发送数据
        sendto(sock,s_buf,sizeof(s_buf),0,(struct sockaddr *)&addr,len);
        printf("server:  send success\n");
    }
    return 0;
}
/*client*/
#include<signal.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
    struct sockaddr_in addr;
    char r_buf[100];
    char s_buf[100];
    int len = sizeof(addr);
    //创建socket描述符
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    perror("socket");
    addr.sin_family = AF_INET;
    //设置对方的端口号和IP地址
    addr.sin_port = htons(6789);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    while(1)
    {
        memset(s_buf,0,100);
        printf("server: send\n");
        fgets(s_buf,sizeof(s_buf),stdin);
        //发送数据
        sendto(sock,s_buf,sizeof(s_buf),0,(struct sockaddr *)&addr,len);
        printf("server:  send success\n");
        memset(r_buf,0,sizeof(r_buf));
        //接收数据
        recvfrom(sock,r_buf,sizeof(r_buf),0,(struct sockaddr *)&addr,&len);
        printf("client: port = %d\n",ntohs(addr.sin_port));
        printf("server: r_buf = %s\n",r_buf);
    }
    return 0;
}

测试结果:

客户机端
在这里插入图片描述
服务器端
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值