网络编程---UDP

**1.UDP:**用户数据报协议,位于传输层

2.特性:

a.无连接---发送完数据后,发送的链路自动释放,所以每次发送数据前都需要简历链路连接

b.不可靠---在发送过程中,数据在任何一个节点上都可能会丢失

c.大数据---同等情况下,UDP协议比TCP协议一包数据的正文更多

**3.UDP框架:**C/S模式

注意:服务端一定要先收后发

4.示例:向客户端发送一张图片

ser端

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
 #include <arpa/inet.h>
typedef struct sockaddr*(SA);
int	main(int argc, char **argv)
{
    if(argc!=2)
    {
        printf("Usage:%s<filename>\n",argv[0]);
        return 1;
    }
    FILE*fd=fopen(argv[1], "r");
    if(fd==NULL)
   {
    perror("fopen fail");
    return 1;
   }

    int sockfd=socket(AF_INET, SOCK_DGRAM, 0);
    if(-1==sockfd)
    {
        perror("sockt fail\n");
        return 1;
    }
//man 7 ip
     struct sockaddr_in ser,cli;
     ser.sin_family=AF_INET;
     //host to net short
     ser.sin_port=htons(50000);
     ser.sin_addr.s_addr=inet_addr("192.168.1.53");

    int ret=bind(sockfd,(SA)&ser,sizeof(ser));
    if(-1==ret)
    {
        perror("bind fail\n");
        return 1;
    }
    socklen_t len=sizeof(cli);
    
    char buf[1024]={0};
    int n;
    while (1)
    {   
        char temp[512]={0};
        recvfrom(sockfd, temp, sizeof(temp),0,(SA) &cli, &len);
         bzero(buf, sizeof(buf));
        n=fread(buf, sizeof(char), sizeof(buf), fd);
        if(n<=0)
        {
            break;
        }
        sendto(sockfd, buf, n, 0, (SA)&cli, len); 
    }

    char temp[512]="finish";
    sendto(sockfd, temp, sizeof(temp), 0, (SA)&cli, len);
    close(sockfd);
    fclose(fd);
    return 0;
}

cli端

cs 复制代码
#include <stdlib.h>
#include <strings.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
typedef struct sockaddr*(SA);
int main(int argc, char **argv)
{
   FILE*fd=fopen("picture_2.png", "w");
   if(fd==NULL)
   {
    perror("fopen fail");
    return 1;
   }
    
    int sockfd=socket(AF_INET, SOCK_DGRAM, 0);
    if(-1==sockfd)
    {
        perror("socket fail\n");
        return 1;
    }
    struct sockaddr_in ser,cli;
    ser.sin_family=AF_INET;
    //host to net short
    ser.sin_port=htons(50000);
    ser.sin_addr.s_addr=inet_addr("192.168.1.53");
     
   while(1)
   {
        char buf[1024]={0};   
        char temp[512]="hello";
        sendto(sockfd, temp,sizeof(temp), 0, (SA)&ser, sizeof(ser));
        ssize_t n=recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);
        if(n < 0) 
        {
            perror("recvfrom error");
            break;
        }
        if(0==strcmp(buf, "finish"))
        {
            break;
        }
        fwrite(buf, sizeof(char), n, fd);
   }
    close(sockfd);
    fclose(fd);
    return 0;
 }
相关推荐
歪歪10010 分钟前
介绍一下HTTP和WebSocket的头部信息
网络·websocket·网络协议·http·网络安全·信息与通信
hope_wisdom16 分钟前
C/C++数据结构之用数组实现栈
c语言·数据结构·c++·数组·
HaleyTiger1 小时前
新电脑(包含联想电脑)访问正常的系统加载不出页面,但是网络telnet又是通畅的(PG数据库连接public模式下能看到表及数据,其他模式下的表和数据看不了)
网络
鸠摩智首席音效师11 小时前
如何在 Apache 中启用 HSTS 以增强网络安全性 ?
网络·apache
Sylvia-girl11 小时前
C语言中经常使用的函数
c语言·开发语言
alex10011 小时前
Context Compliance Attack:大模型安全的新兴威胁与防御策略
网络·安全·web安全
Cauhele浅能12 小时前
【嵌入式C快捷键设计】表驱动法实现
c语言·设计模式
润 下13 小时前
C语言——深入理解函数声明定义和调用访问
c语言·开发语言·经验分享·笔记·程序人生·其他
范纹杉想快点毕业14 小时前
单片机开发中的队列数据结构详解,队列数据结构在单片机软件开发中的应用详解,C语言
c语言·数据库·stm32·单片机·嵌入式硬件·mongodb·fpga开发
追逐梦想的小孩15 小时前
从零开始学华为:Console口连接设备
网络·华为·交换机