Linux网络编程-UDP实现QQ聊天功能
目录
一、什么是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网络编程的学习,可以关注博主专栏,持续更新中,如有疑问,评论区留言或私信。
Linux网络编程-UDP实现QQ聊天功能相关推荐
- Linux网络编程中的几组类似功能的区别
1.bzero与memset char buff[1024]; memset(buff,0,sizeof(buff));bzero(buff, sizeof(buff)); struct sockad ...
- 6、linux网络编程--UDP协议编程
一.概述: UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的运输层协议,在网络中用于处理数据包,是一种无连接的协议.UDP 不提供可 ...
- Linux网络编程-UDP和TCP协议详解
1|0一. 引言 网络协议是每个程序员都要掌握的基础知识,干啥都离不开网络,就算在家里新买了个路由器不是吗,同事连不上网,你的女朋友手机没有网看剧了正看到高潮部分,到那时候你打开百度......那嫌弃 ...
- linux网络编程---UDP
文章目录 UDP编程模型 举例 UDP_A UDP_ B UDP域套接字 LOCAL_A LOCAL_B UDP编程模型 举例 UDP_A #include <stdio.h> #incl ...
- linux网络编程TCP多人聊天室
用socket实现一个多人聊天室的思路很简单,即在服务器端定义一个fd的int型数组,用来存储已经连接的客户端的socket连接套接字fd(因为发送和接收数据都只需要借助连接套接字fd),当服务器接收 ...
- Java网络编程,模拟QQ群聊功能
Java网络编程,模拟QQ群聊功能 一.网络编程知识点简介: 1.C/S架构:Client客户端/Server服务器: 涉及到的应用:桌面的应用软件,QQ,王者荣耀 涉及到的技术:Socket网络编程 ...
- 【Linux网络编程】UDP 套接字编程
[Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...
- Linux网络编程:用C语言实现的聊天程序(同步通信)
通过TCP协议,用C语言实现的同步聊天程序,注释写的比较详细,个人觉得对字符串处理比较充分,能够正常编译运行,拿出来和大家分享一下! 1.客户端源代码: [cpp] view plaincopypri ...
- 基于UDP客户端服务器的编程模型-linux网络编程
坚持在代码中注释,边读代码边学习Linux网络编程 使用到的发送函数原型: #include <sys/types.h>#include <sys/socket.h>ssize ...
- 【Linux网络编程】循环服务器之UDP循环模型
00. 目录 文章目录 00. 目录 01. 概述 02. UDP循环服务器的实现方法 03. UDP循环服务器模型 04. UDP循环服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按 ...
最新文章
- django学习笔记--数据库中的多表操作
- 实验mongodb使用gridfs存放一个大文件
- SAS vs SSD各种模式下MySQL TPCC OLTP对比测试结果
- mysql编码是乱码_mysql中文乱码 常见编码问题解决方法分享
- SpringBoot+MySQL+MyBatis+Shiro+AdminLTE
- Java JFrame实现全屏的四种方式
- 用户级线程与内核级线程
- 使用BlazeDS实现Java和Flex通信之hello world
- 网络请求与本地函数调用的区别
- Flink 合流水位线图解
- HBase性能优化方法总结
- 深度学习框架如何优雅的做算子对齐任务?
- git pull origin拉取报错 Pulling without specifying how to reconcile divergent branches is
- C++独立游戏存档模块设计 VERSION_1.7
- 南佛罗里达大学计算机科学硕士,南佛罗里达大学计算机科学理学硕士研究生申请要求及申请材料要求清单...
- Windows下生成ssh密钥,并用ssh免密访问Linux服务器
- ctf GetFlag
- 移动最快apn服务器,中国移动修改APN为CMTDS提高4G网速
- java-php-python--数字相册管理系统-点赞演示2021计算机毕业设计
- 使用bat脚本上传文件到Linux服务器