基于UDP编程_udp详解

基于UDP编程_udp详解基于UDP编程1UDP是数据报协议,无连接的,不可靠,追求传输效率的一种通信协议数据的发送和接收是同步的.在进行通信之前,不需要建立连接.其传输效率比TCP高.对其服务器而言,并没有三次握手的过程.因此和TCP相比,少了被动监听(listen)和(accept).只需要创建通信设备,绑定IP地址和端口号.然后进行数据的收发.1.服务器端的编程模型创建一个socket端点,返回该端点的文件描述符fdsocket(2)2)将fd和本地地址绑定bind(2)while(1){3)阻塞等待

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

基于UDP编程
1 UDP是数据报协议,无连接的,不可靠,追求传输效率的一种通信协议数据的发送和接收是同步的.在进行通信之前,不需要建立连接.其传输效率比TCP高.对其服务器而言,并没有三次握手的过程.因此和TCP相比,少了被动监听(listen)和(accept).只需要创建通信设备,绑定IP地址和端口号.然后进行数据的收发.

1.服务器端的编程模型

  1. 创建一个socket端点,返回该端点的文件描述符fd socket(2)
    2 )将fd和本地地址绑定 bind(2)

while(1){

3) 阻塞等待客户端消息 recvfrom(2)
4 )处理客户消息
5 )将处理结果发送给客户端 sendto(2)
}
2 客户端的编程模型
1 创建一个socket端点 socket(2)
2 使用fd设备向服务器发送消息 sendto(2)
3 阻塞等待服务器的响应消息 recvfrom(2)
4 处理响应消息
4 关闭fd设备 close(2)

编程实现
服务器端

#include <stdio.h>
#include <t_net.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
int main(void){ 
   
    SA4 cli;
    char buf[128];
    socklen_t len;
    int fd = bind_sock(AF_INET,SOCK_DGRAM,8000);
    if(fd == -1){ 
   
        printf("%s\n",strerror(errno));
        return -1; 
    }   
    while(1){ 
   
        len = sizeof(cli);
        int recv = recvfrom(fd,buf,128,0,(SA*)&cli,&len);
        if(recv == -1){ 
   
            printf("%s\n",strerror(errno));
                  return -1;
        }
        for(int i = 0;i < recv;i++){ 
   
            buf[i] = toupper(buf[i]);
        }
        sendto(fd,buf,recv,0,(SA*)&cli,sizeof(cli));
    }
    return 0;
}                                                                     ``

关于t_net.h,参见博主上一篇博客:TCP并发服务的实现
客户端

#include <stdio.h>
#include <errno.h>
#include <t_net.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc,char* argv[]){ 
   
    char msg[128];
    char buf[128];
    int fd = socket(AF_INET,SOCK_DGRAM,0);
    if(fd == -1){ 
   
        printf("%s\n",strerror(errno));
        return 0;
    }   
    SA4 serv;
    serv.sin_family = AF_INET;
    serv.sin_port = htons(8000);
    inet_pton(AF_INET,argv[1],&serv.sin_addr);
	while(1){ 
   
        gets(msg);
        //printf("%d\n",sizeof(msg));
        sendto(fd,msg,strlen(msg) + 1,0,(SA*)&serv,sizeof(serv));
        int recv = recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
        if(recv > 0){ 
   
            //write(1,buf,recv);
            printf("%s\n",buf);
            if(strcmp(buf,"BYEBYE") == 0) break;
        }
    }
    close(fd);
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197204.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • js数组排序—自定义快速排序

    js数组排序—自定义快速排序数组自带的sort方法 vararr=[3,4,2,1]; arr.sort(); console.log(arr);进行递增排序(4)[1,2,3,4]sort方法可以接收一个参数,用来自定义排序规则 arr.sort(function(val1,val2){ //returnval1-val2;默认 returnval2-…

  • datagrip最新激活码【在线破解激活】

    datagrip最新激活码【在线破解激活】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • java定时任务quartz配置_taskregistrar

    java定时任务quartz配置_taskregistrar这篇文章主要介绍了spring中定时任务taskScheduler的相关资料,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。前言众所周知在spring3.0版本后,自带了一个定时任务工具,而且使用简单方便,不用配置文件,可以动态改变执行状态。也可以使用cron表达式设置定时任务。被执行的类要实现Runnable接口TaskScheduler接口Tas…

    2022年10月11日
  • Redis 客户端连接

    Redis 客户端连接Redis命令用于在redis服务上执行操作。要在redis服务上执行命令需要一个redis客户端。Redis客户端在Redis包中有提供,这个包在我们前面的安装教程中就有安装过了。Redis通过监听一个TCP端口或者Unixsocket的方式来接收来自客户端的连接,当一个连接建立后,Redis内部会进行以下一些操作:首先,客户端socket会被设置

  • ubuntu安装opencv的正确方法

    ubuntu安装opencv的正确方法本文介绍的是如何安装ubuntu下C++接口的opencv1.安装准备:1.1安装cmakesudoapt-getinstallcmake1.2依赖环境sudoapt-getinstallbuild-essentiallibgtk2.0-devlibavcodec-devlibavformat-devlibjpeg-devlibswscale-devlib…

  • java三大框架容易学吗,要学多久?

    java三大框架容易学吗,要学多久?转自:http://www.pinlue.com/article/2021/02/1313/4711532901956.html

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号