udp通信


TCP UDP各自优缺点:

    TCP:    面向连接的,可靠数据包传输。对于不稳定的网络层,采取完全弥补的通信方式。丢包重传。

        优点:
        
            稳定
        
                数据流量稳定、速度稳定、顺序

        缺点:
    
            传输速度慢、效率低、开销大

        使用场景:数据的完整性要求较高,不追求效率

              大数据传输、文件传输


    UDP:    无连接的 不可靠的数据报传输。对于不稳定的网络层,采取完全不弥补的通信方式。默认还原网络状况

        优点:
    
            传输速度快、效率高、开销小

        缺点:
    
            不稳定        

                数据流量、速度、顺序


        使用场景:对时效性要求较高场合。稳定性其次

             游戏、视频会议、视频通话。     大公司 --应用层数据校验协议,弥补udp不足

UDP实现的  C/S     模型:

    recv()/send() 只能用于 tcp 通信。替代 read、write

    accept() ---connect() ---被舍弃

    server:

        lfd = socket(AF_INET,STREAM,0);        SOCK_DGRAM--报式协议


        bind();

        listen(); --可有可无

        while(1){


            read(cfd,buf,sizeof) --被替代 -- recvfrom()涵盖accept传出地址结构

              ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

                        struct sockaddr *src_addr, socklen_t *addrlen);

            sockfd: 套接字

            buf:存储数据的缓冲区

            len:数据长度

            flags:0

            src_addr: (struct sockaddr*)&addr 传出。对端地址结构

            addrlen:地址结构长度

                


            小--大

            write(); --被替代 -- sendto()

            ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

                      const struct sockaddr *dest_addr, socklen_t addrlen);

            sockfd: 套接字

            buf:存储数据的缓冲区

            len:数据长度

            flags:0

            dest_addr: 目标地址结构

            addrlen:地址结构长度

        返回值:成功 写出数据字节数  失败: -1、errno

        }
    
        close();


    client:


        connfd = socket(AF_INET,SOCK_DGREAM,0);

        sendto('服务器地址结构’,地址结构大小)

        recvfrom()

        写到屏幕

        close();

//serve


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<ctype.h>

#define SERV_PORT  9527


void sys_err(const char* str){
  perror(str);
  exit(1);
}
int main(){
  int lfd = 0;
  int ret;
  char buf[BUFSIZ],client__IP[1024];


  struct sockaddr_in  serv_addr,clit_addr;
  socklen_t clit_addr_len;


  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(SERV_PORT);
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

  lfd =socket(AF_INET,SOCK_DGRAM,0);
  if(lfd==-1){
    sys_err("socket error");
  }

  bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));


  clit_addr_len = sizeof(clit_addr);
  while(1){

    ret = recvfrom(lfd,buf,sizeof(buf),0,(struct sockaddr*)&clit_addr,&clit_addr_len);

    printf("client ip :%s port:%d\n"
        ,inet_ntop(AF_INET,(void*)&clit_addr.sin_addr.s_addr,client__IP,sizeof(client__IP)),
        ntohs(clit_addr.sin_port));
    write(STDOUT_FILENO,buf,ret);
    for(int i=0;i<ret;++i)
      buf[i]=toupper(buf[i]);
    sendto(lfd,buf,ret,0,(struct sockaddr*)&clit_addr,sizeof(clit_addr));
  }
  close(lfd);


  return 0;
}


========================================================================================
//client
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<ctype.h>

#define SERV_PORT  9527


void sys_err(const char* str){
  perror(str);
  exit(1);
}
int main(){
  int cfd;
  char buf[BUFSIZ];
  
  struct sockaddr_in serv_addr;   //服务器地址结构

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(SERV_PORT);

  inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr);


  cfd = socket(AF_INET,SOCK_DGRAM,0);
  if(cfd==-1){
    sys_err("socket error");
  }
  while(1){
    fgets(buf,sizeof(buf),stdin);
    sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

    int ret = recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
    write(STDOUT_FILENO,buf,ret);

  }
  close(cfd);
  

  return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值