精华内容
下载资源
问答
  • qt 基于UDP实现的语音通话,既可以接收数据,也可以发送数据,可以作为客户端和服务端,使用QAudioInput录音和QAudioOutput播放音频,64位,windows和linux下都测试可运行
  • UDP实现的FTP

    2019-01-18 09:30:41
    实现一个类FTP功能的协议,...(1)下层使用UDP服务。 (2)支持多用户。 (3)多用户文件的上传和下载可以仅支持当前目录。 (4)给出协议的具体内容。 (5)给出收发双方的交互日志。 (6)使用c系列语言进行实现
  • 绑定IP 和 客户端的 UDP 通讯 ,可以建两个相同的工程,互相对发(修改下绑定的IP 和端口) 详细介绍见https://mp.csdn.net/postedit/81352132
  • 以前用Java做的UDP聊天,现在拿出来,你们在使用时需要改一下里面的IP地址及端口号,运行时要先运行服务器再运行客户端。
  • 计算机网络课设 利用UDP实现聊天系统 java实现 内含报告文档 仅供参考
  • UDP实现DAYTIME服务

    2014-10-05 17:22:19
    本代码是编写针对DAYTIME服务的UDP客户机和服务器的实现。要求显示DAYTIME返回的日期和时间值。
  • 主要为大家详细介绍了java利用udp实现发送数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • C++ UDP实现通信

    2013-03-11 21:59:49
    只有CLIENT的代码
  • 有很多关于如何实现 UDP 服务器客户端的示例,但没有通过 UDP 实现发布者订阅者。 看看我们在通过 UDP 发送时如何丢失一些数据很有趣。 如何执行 git clone ...
  • C语言用UDP实现局域网聊天程序源码,能够实现用户的注册,登陆,群发和私聊的功能。
  • 主要介绍了python3通过udp实现组播数据的发送和接收操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • python实现udp聊天窗口

    2020-12-20 09:05:20
    下面是,用udp实现的聊天窗口. import socket def send_msg(upd_socket): """发送消息""" # 获取要发送的内容 dest_ip = input("请输入对方的ip地址:") dest_port = int(input("请输入对方的端口号:")) send_...
  • Linux网络编程-UDP实现QQ聊天功能

    千次阅读 2021-12-09 17:17:52
    三、UDP实现QQ聊天功能 3.1 代码实现 3.2 编译 3.3 效果 四、总结 一、什么是UDP UDP协议详解可以查看博主其他博客,更有助于后面的开发实现。 Linux网络编程-UDP协议详解 二、UDP单播 本博客是使用UDP单播...

    目录

    一、什么是UDP

    二、UDP单播

    三、UDP实现QQ聊天功能

    3.1 代码实现

    3.2  编译

    3.3  效果

     四、总结


    一、什么是UDP

            UDP协议详解可以查看博主其他博客,更有助于后面的开发实现。Linux网络编程-UDP协议详解_ProYuan的博客-CSDN博客一、UDP的概述UDP(User Datagram Protocol,用户数据报协议)是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。UDP提供不可靠服务,具有TCP所没有的优势:UDP无连接,时间上不存在建立连接需要的时延。空间上,TCP需要在端系统中维护连接状态,需要一定的开销。此连接装入包括接收和发送缓存,拥塞控制参数和序号与确认号的参数。UCP不维护连接状态,也不跟踪这些参数,开销小。空间和时间上都具有优势。举个例子:DNS如果运行在TCPhttps://blog.csdn.net/u012478275/article/details/121614965?spm=1001.2014.3001.5501

    二、UDP单播

            本博客是使用UDP单播实现QQ聊天功能,更多有关UDP单播介绍和和实现,可以查看博主文章:

    Linux网络编程-UDP单播服务客户端代码实现_ProYuan的博客-CSDN博客一、UDP单播介绍1.UDP介绍 UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。更多UDP详细介绍可以查看:Linux网络编程-UDP协议详解2.单播简介主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要...https://blog.csdn.net/u012478275/article/details/121626964?spm=1001.2014.3001.5501

    三、UDP实现QQ聊天功能

    3.1 代码实现

    由于是聊天,肯定需要两个程序收发数据来实现QQ聊天。

       1. 第一个应用代码实现

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/select.h>
    #include <sys/time.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <pthread.h>
    
    /************************************************************************
    函数名称:	void *Recv_Thread(void* arg)
    函数功能:	线程函数,负责接收对方的信息,并打印
    函数参数:	arg套接字
    函数返回:	无
    ************************************************************************/
    void *Recv_Thread(void* arg)
    {
    	int sockfd = (int)arg;
    	struct sockaddr_in recvaddr;
        socklen_t recvaddrlen = sizeof(recvaddr);
    	while(1)
    	{
    		char recv_buf[200]  = "";
    		recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&recvaddr, &recvaddrlen);
    		printf("\r\033[31mUdpQQ1 Recv:%s\n",recv_buf);
    		printf("\r\033[32mUdpQQ1 Send:");
    		fflush(stdout);
    	}
    	return NULL;
    }
    
    /************************************************************************
    函数名称:	int main(int argc, char *argv[])
    函数功能:	主函数,用线程实现聊天
    函数参数:	无
    函数返回:	无
    ************************************************************************/
    int main(int argc, char *argv[])
    {
    	struct sockaddr_in my_addr; 
    	struct sockaddr_in dest_addr;
    	
    	//对套接字地址进行初始化
    	bzero(&my_addr, sizeof(my_addr));
    	my_addr.sin_family = AF_INET;
    	my_addr.sin_port   = htons(8001);
    	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    	bzero(&dest_addr, sizeof(dest_addr));	
    	dest_addr.sin_family = AF_INET;
    	dest_addr.sin_port   = htons(8000);
    
    	//创建套接口
    	int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    	if( sockfd < 0)
    	{
    		perror("socket error");
    		exit(-1);
    	}
    	
    	//设置端口
    	int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
    	if( err_log < 0)
    	{
    		perror("bind");
    		close(sockfd);		
    		exit(-1);
    	}
    	
    	printf("Welcome ProYuan28 UDP QQ!!!\n");
    	//创建接收线程
    	pthread_t tid;
    	pthread_create(&tid, NULL, Recv_Thread, (void*)sockfd); //创建线程
    	
    	
    	//主进程负责发送消息
    	while(1)
    	{	
    		printf("\r\033[32mUdpQQ1 Send:");
    		char send_buf[512] = "";
    		fgets(send_buf, sizeof(send_buf), stdin); //等待输入
    		send_buf[strlen(send_buf) - 1] = '\0';    //确保输入的最后一位是'\0'
    		if(strncmp(send_buf, "exit", 4) == 0)
    		{
    			close(sockfd);
    			exit(0);
    		}
    		sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
    	}
    	return 0;
    }
    

       2. 第二个应用

            其他和上面一样,修改收发端口就行。

    	bzero(&my_addr, sizeof(my_addr));
    	my_addr.sin_family = AF_INET;
    	my_addr.sin_port   = htons(8000);
    	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    	bzero(&dest_addr, sizeof(dest_addr));	
    	dest_addr.sin_family = AF_INET;
    	dest_addr.sin_port   = htons(8001);

    3.2  编译

    gcc  qq_udp.c  -o qq_udp  -lpthread

    3.3  效果

           

     四、总结

    一个简单QQ聊天就实现了,整个流程还是比较简单的,也是学习UDP通讯很经典的例子,更多Linux网络编程的学习,可以关注博主专栏,持续更新中,如有疑问,评论区留言或私信。

    展开全文
  • c#中关于udp实现可靠地传输(数据包的分组发送)
  • 可靠UDP实现代码

    2013-05-21 16:13:15
    Linux下 UDP可靠数据传输实现代码
  • udp实现聊天室项目

    2018-12-17 13:30:55
    udp实现聊天室项目,有注册,登陆,群聊,私聊功能。采用sqlite3数据库保存用户信息,采用链表实现群聊和私聊功能。
  • UDP实现高并发其实非常简单

    千次阅读 2021-04-03 11:15:17
    UDP越来越被重视了,人们期望它和TCP一样,但是呢?… UDP能不能像TCP那样做高并发? 内核早在3.9版本就支持REUSEPORT了,但直到2015年底,我也只能做个表面上(看起来像那么回事,但实际上就是垃圾的东西)的东西: ...

    UDP越来越被重视了,人们期望它和TCP一样,但是呢?…

    UDP能不能像TCP那样做高并发?

    内核早在3.9版本就支持REUSEPORT了,但直到2015年底,我也只能做个表面上(看起来像那么回事,但实际上就是垃圾的东西)的东西:
    https://blog.csdn.net/dog250/article/details/17061277
    但也只是看起来像,除此之外,我当时的想法相当于垃圾。

    UDP做高并发非常简单,和TCP的accept模型似乎没有什么区别,下面是一个随手撸的代码,主要是跟着小小学python:

    #!/usr/bin/python3
    import select
    import socket
    
    sd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    sd.bind(('192.168.56.102', 1234))
    sd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    
    inputs = [sd]
    
    while True:
    	readable = select.select(inputs, [], [], 1.0)[0]
    	for s in readable:
    		if s == sd: # Accept 逻辑在此if分支实现
    			data, addr = s.recvfrom(1024)
    			# 创建per-客户端socket
    			csd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    			csd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    			csd.bind(('192.168.56.102', 1234))
    			csd.connect(addr)
    			inputs.append(csd)
    			print('accept connection from %s:%s' % addr, 'sd[%d] created' % csd.fileno())
    		else: # 这个else分支处理per-客户端的socket
    			data, addr = s.recvfrom(1024)
    			if data:
    				print('received "%s" from %s' % (data.splitlines()[0].decode('utf-8'), addr), 'sd[%d]' % s.fileno())
    				s.sendto(data, addr)
    

    是不是超级简单,比我之前长篇大论的垃圾强多了。

    根本就一点, 只要socket数量上去了,并发也就是上去了, 因为一个socket一个读队列一个写队列,你再分身文件描述符也没鸟用,唯一的办法就是创建多个socket,这样队列操作就可以彼此分开并行处理了。至于accept逻辑,那只是让UDP看起来像TCP而已,这是次要的。

    由于UDP的无连接性,在实际client发送数据前,server是不知道四元组信息的,并且也不知道UDP通信的模式,如果是oneshot,pingpong形式的数据,那谈不上什么连接跟踪的必要,但是对于类似QUIC这种 长连接 的流式数据传输而言,UDP只是承载数据的一个协议而已,这个时候只要知道了四元组,当然也就可以专门创建一个socket,用connect来保持住这个 连接 了。

    问题是,当有数据进入UDP处理的时候,内核协议栈如何查找到对应的socket呢?如果socket数量数以万计,查找的开销还是可观的,这里的问题有两点:

    • 对于connected的UDP socket,无法使用REUSEPORT的四元组hash模数取余机制。
      REUSEPORT的四元组hash模数取余机制会导致同一个四元组随着socket数量增减而对应到不同的socket,无法和线程,epoll模型协同。详情看:
      https://lore.kernel.org/patchwork/patch/1129552/
    • 如果不能用REUSEPORT的模数取余机制,所有socket只能二元组hash来组织。
      所有的socket由于bind同一个地址和端口,将会位于同一个hash桶中,退化成链表。

    看下效果:
    在这里插入图片描述

    所以说呢?这里就有优化空间了,如何用四元组来组织hash表呢?看这里:
    https://blog.csdn.net/dog250/article/details/104219341

    UDP在QUIC的催化作用下,近些年已经逐渐规模化了,UDP很多隐藏的实现问题逐步暴露,优化点也越来越多,事情才刚刚开始。

    杏花村不让买了,也就不喝了,哎…


    浙江温州皮鞋湿,下雨进水不会胖。

    展开全文
  • 使用java通过UDP实现一对多聊天室,而且有窗口
  • UDP协议的格式 16位(2字节) 16位(2字节) 16位(2字节) 16位(2字节) UDP源端口号 UDP目的端口号 UDP长度 UDP检验和 数据 16位UDP长度 : 头部8字节 + UDP数据字节 最大长度为64K. ...

    UDP基于传输层

    UDP协议

    UDP协议的格式

    16位(2字节)16位(2字节)16位(2字节)16位(2字节)
    UDP源端口号UDP目的端口号UDP长度UDP检验和数据
    • 16位UDP长度 : 头部8字节 + UDP数据字节 最大长度为64K.
    • 如果校验和出错, 就会直接丢弃;

    UDP的特点

    UDP的传输过程类似于寄信

    • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
    • 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;(意思就是,我反正给你发了,你没收到是你的事,与我无瓜!!!)
    • 面向数据报: 不能够灵活的控制读写数据的次数和数量; (我很懒,宁愿一次给你拉完一吨的东西,也不愿意分多次给你拉)

    面向数据报

    什么时面向数据报

    应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并; (老实巴交的)

    用UDP传输100个字节的数据:

    • 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节;

    基于UDP的应用层协议

    基于UDP的应用层协议

    NFS: 网络文件系统
    TFTP: 简单文件传输协议
    DHCP: 动态主机配置协议
    BOOTP: 启动协议(用于无盘设备启动)
    DNS: 域名解析协议
    当然, 也包括你自己写UDP程序时自定义的应用层协议;


    用UDP实现可靠传输(经典面试题)

    参考TCP的可靠性机制, 在应用层实现类似的逻辑;

    • 引入序列号, 保证数据顺序;
    • 引入确认应答, 确保对端收到了数据;
    • 引入超时重传, 如果隔一段时间没有应答, 就重发数据
    展开全文
  • UDP实现客户端服务器双向通信
  • android实现局域网聊天 - UDP实现 android实现局域网聊天 - UDP实现 android实现局域网聊天 - UDP实现 android实现局域网聊天 - UDP实现
  • 主要为大家详细介绍了java基于UDP实现图片群发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 简单的UDP实现

    千次阅读 2018-08-07 12:47:12
    根据UDP协议的特性,我们实现一个简单的回显服务器。 UDP协议: 传输层协议 无连接 不可靠 面向数据报 服务器代码: #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #...

    根据UDP协议的特性,我们实现一个简单的回显服务器。

    UDP协议:
    传输层协议
    无连接
    不可靠
    面向数据报

    服务器代码:

       ///                                                                                                                                        
       // UDP版本的服务器
       // 1.绑定端口号
       // 2.服务器7*24小时等待客户端发送的请求
       // 3.把响应发回客服端
       //
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<arpa/inet.h>
    #include<netinet/in.h>
    
    void service(int sock)
    {
        char buf[128];
        for(;;)
        {
            //临时的sockaddr_in 结构体接收
            struct sockaddr_in peer;
            socklen_t len = sizeof(peer);
            buf[0] = 0;
            //接收客户端发来的数据   数据存在buf
            ssize_t s  = recvfrom(sock,buf,sizeof(buf)-1,\
                                  0,(struct sockaddr*)&peer,&len);
    
            if(s > 0)
            {
                buf[s] = 0;
                //打印从哪个客户端接收到的数据
                printf("[%s,%d] # %s\n",inet_ntoa(peer.sin_addr),\
                                ntohs(peer.sin_port),buf);
                //把响应发送给客户端   buf
                sendto(sock,buf,strlen(buf),0,\
                       (struct sockaddr*)&peer,len);
            }
        }
    }
    
     // ./server 0  8080
    int main(int arg,char *argv[])
    {
        if(arg != 3)
        {
            printf("usage: %s [ip] [port]\n",argv[0]);
            return 1;
        }
        //SOCK_DGRAM表示UDP ipv4: AF_INETET 
        int sock = socket(AF_INET,SOCK_DGRAM,0);
        if(sock < 0)
        {
            printf("socket error!\n");
            return 2;
        }
        //初始化sockaddr_in local    IPV4: AF_INET 
        struct sockaddr_in local;
        local.sin_family = AF_INET;
        local.sin_port = htons(atoi(argv[2]));
        //字符串IP地址 转换成 in_addr_t   :inet_addr() 看博主博客的地址转换函数的介绍
        local.sin_addr.s_addr = inet_addr(argv[1]);
    
        //绑定端口号
        if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0)
        {
            printf("bind error\n");
            return 3;
        }
        //业务  ---  回显
        service(sock);
    
        close(sock);
        return 0;
    }

    客户端代码:

     // UDP 版本的客户端
     // 1. 从标准输入, 读入一个字符串
     // 2. 把这个字符串通过 socket 发送给服务器
     // 3. 尝试从服务器读取响应数据
     // 4. 把响应结果写到标准输出上.
      ///////////////////////////////////////////////////////
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<arpa/inet.h>
    #include<netinet/in.h>
    
    //client  127.0.0.1 8080
    
    int main(int arg,char *argv[])
    {
        if(arg != 3)
        {
            printf("usage: %s [ip] [port]\n",argv[0]);
            return 1;
        }
        //创建sock < 0 创建失败  SOCK_DGRAM表示UDP ipv4: AF_INETET 
        int sock = socket(AF_INET,SOCK_DGRAM,0);
        if(sock < 0)
        {
            printf("socket error\n");
            return 2;
    
    
        //初始化 sockaddr_in  ipv4: AF_INETET  
        struct sockaddr_in server;
        server.sin_family = AF_INET;
        //端口号:atoi 字符转换成数字
        server.sin_port = htons(atoi(argv[2]));
        //IP地址转换函数   ----看博主博客地址转换函数的介绍
        server.sin_addr.s_addr = inet_addr(argv[1]);
        socklen_t len = sizeof(server);
    
        //缓冲区
        char buf[128];
    
        //回显服务器,死循环
        for(;;)
        {
            buf[128] = 0;
            //从标准输入中读取存放在buf   sizeof(buf)-1 是为了最后为一个字节为0 
            ssize_t s = read(0,buf,sizeof(buf)-1);
            if(s>0)
            {
                buf[s-1] = 0;
    
                //发送数据
                sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&server,len);
                //接受数据
                s = recvfrom(sock,buf,sizeof(buf)-1,0,NULL,NULL);
                if(s > 0)
                {
                    buf[s] = 0;
                    printf("server echo# %s\n",buf);
                }
            }
        }
    
        close(sock);
        return 0;
    }

    运行结果:
    client:
    这里写图片描述

    server:
    这里写图片描述

    ps:

    发送函数:
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                          const struct sockaddr *dest_addr, socklen_t addrlen);
    
    sockfd: socket
    const void *buf: 缓冲区地址
    size_t len:缓冲区的大小,buf的大小
    int flags: 0
    const struct sockaddr *dest_addr,结构体的地址
    socklen_t addrlen : 结构体大小
    
    
    接收函数:
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                            struct sockaddr *src_addr, socklen_t *addrlen);
    
    int sockfd:socket 
    void *buf:缓冲区地址
    size_t len:缓冲区大小
    int flags:0
    struct sockaddr *src_addr:结构体地址
    socklen_t *addrlen:结构体大小
    展开全文
  • 用Linux gcc编写的socket UDP文件传输 本文实现了用UDP协议传输传输文件 UDP传1GB的文件仅需15秒 该代码包含 根据文件内容长度生成MD5码,以供校验文件完整性
  • 怎么用 UDP 实现 TCP?

    千次阅读 2020-12-07 22:03:12
    其实面试官主要是想让我说出 UDP 和 TCP 的原理上的区别,怎么给 UDP 加些功能实现 TCP。 下面我会以大白话的方式来解答上面的问题。 UDP 的特点 UDP 让我想起了刚毕业参加工作那会,一名毕业菜鸟。 沟通简单 领导...
  • C#实现的以UDP协议通信的局域网聊天软件,含有客户端和服务器,客户端发送的信息首先达到服务器,服务器转发给目的主机,服务器可以监控客户端的聊天情况。客户端也可以和服务器聊天。程序开始时先设置服务器IP地址...
  • TCP如何实现可靠传输、UDP实现可靠传输之KCP协议
  • UDP实现P2P

    2013-04-02 09:21:14
    一个用于测试UDP实现穿越NAT的服务端程序
  • 通过客户端,服务器端实现简单聊天,有双人聊天,视屏

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 298,810
精华内容 119,524
关键字:

udp实现