当前位置: 首页 > news >正文

天津网站制作西安网络工程师培训班哪里

天津网站制作西安,网络工程师培训班哪里,phpcms做装修网站,重庆拓达建设集团网站目录 一、端口号 二、UDP报头格式 三、UDP的特点 四、UDP协议实现网络聊天群 一、端口号 端口号port标识了一个主机上进行通信的不同的应用程序。 0 ~ 1023#xff1a;系统端口号#xff0c;HTTP、FTP、SSH等这些广为使用的应用层协议#xff0c;它们的端口号都是固定…目录 一、端口号 二、UDP报头格式 三、UDP的特点 四、UDP协议实现网络聊天群 一、端口号 端口号port标识了一个主机上进行通信的不同的应用程序。 0 ~ 1023系统端口号HTTP、FTP、SSH等这些广为使用的应用层协议它们的端口号都是固定的系统端口号知名端口号1024 ~ 65535操作系统动态分配的端口号客户端程序的端口号可有操作系统分配或程序员分配普通端口号 知名端口号Well-Know Port Number ftp服务器21ssh服务器22telnet服务器23http服务器80https服务器443 查看知名端口号cat /etc/services netstat一个用来查看网络状态的重要工具 语法netstat -[选项] n拒绝显示别名能显示数字的全部显示数字l仅列出有在 listen 状态的服务状态p显示建立相关连接的程序名t仅显示tcp相关选项u仅显示udp相关选项a显示所有选项默认不显示 listen 相关 pidof查看服务器的进程id通过进程名查看进程id 语法pidof [进程名] 端口号   -----   进程唯一关系 一个端口号是否可以被多个进程bind不可以端口号指向进程必须唯一一个进程是否可以绑定多个端口号可以进程指向端口号不一定唯一 二、UDP报头格式 16位UDP长度表示整个数据报UDP首部UDP数据的最大长度64K如果检验和出错数据直接丢弃 定长报头报头的本质是结构化数据 三、UDP的特点 UDP传输的过程类似于寄信 无连接知道对端的IP和端口号就直接进行传输不需要建立连接不可靠没有确认机制没有重传机制如果因为网络故障导致数据段无法发送UDP协议层也不会给应用层返回任何错误信息面向数据报应用层交给UDP多长的报文UDP原样发送既不会拆分也不会合并不能够灵活的控制读写数据的次数和数量 UDP的缓冲区 UDP没有真正意义上的发送缓冲区调用sendto会直接交给内核由内核将数据报传给网络层协议进行后续的传输处理UDP具有接收缓冲区但是这个接收缓冲区不能保证收到的UDP报文的顺序和发送UDP报文的顺序一致如果缓冲区满了再到达的UDP数据就会被丢弃 UDP的socket既能读也能写这就是全双工概念。 基于UDP的常用应用层协议 NFS网络文件系统TFTP简单的文件传输协议DHCP动态主机配置协议BOOTP启动协议用于无盘设备启动DNS域名解析协议 UDP协议的应用场景多为视频网站、直播平台等不担心数据包丢失的情况。 四、UDP协议实现网络聊天群 设计思路 服务器与客户端通过udp协议通信即server和client都需要创建自己的socket套接字server创建完socket套接字之后需要将server自身的ip和port和套接字bind绑定client的套接字不需要显式bind绑定由OS自动绑定server先运行通过recvfrom()向数据的接收缓冲区循环读取数据client在运行的时候指定server的ip和port通过sendto()向服务器的接收缓冲区发送数据User.h头文件进行在线用户管理通过ip和port形成用户信息结构体可以进行在线用户的添加、删除、判断并且在server接收到数据的时候进行广播对所有在线用户发送刚刚接收到的数据所有在线用户信息通过一个静态全局变量的哈希表管理key值是ip-port组成的字符串client在运行的时候就会进行一次线程分离分离出去的线程循环读取并打印client自身的接收缓冲区内的数据来自广播的数据 设计效果当多个client连接server之后只要是online登录了的用户都可以向server发送数据的同时看到自己和其他登录用户发送的数据这就是网络聊天群 User.h #pragma once#include iostream #include string #include cstring #include unordered_map#include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.hclass User { public:User(const std::string ip, const uint16_t port): _ip(ip), _port(port){}std::string ip(){return _ip;}uint16_t port(){return _port;}private:std::string _ip;uint16_t _port; };class OnlineUser { public:OnlineUser(){}void AddUser(const std::string ip, const uint16_t port){std::string id ip - std::to_string(port);_users.insert(std::make_pair(id, User(ip, port)));}void DelUser(const std::string ip, const uint16_t port){std::string id ip - std::to_string(port);_users.erase(id);}bool IsOnline(const std::string ip, const uint16_t port){std::string id ip - std::to_string(port);return _users.find(id) ! _users.end();}void BroadcastMessage(int sockfd, const std::string message, const std::string ip, const uint16_t port){for (auto user : _users){struct sockaddr_in client;client.sin_family AF_INET;client.sin_addr.s_addr inet_addr(user.second.ip().c_str());client.sin_port htons(user.second.port());std::string s [ ip - std::to_string(port) ] # message;sendto(sockfd, s.c_str(), s.size(), 0, (struct sockaddr*)client, sizeof(client));}}private:std::unordered_mapstd::string, User _users; }; server.cpp #include iostream #include cstdlib #include string #include cstring #include cerrno #include cassert #include functional #include memory#include unistd.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h#include User.husing namespace std;typedef functionvoid(int, string, uint16_t, string) func_t; static string defaultIP 0.0.0.0;class UdpServer { public:UdpServer(const func_t func, const uint16_t port, const string ip defaultIP): _cb(func), _port(port), _ip(ip){}void Init(){// 1. 创建套接字_sockfd socket(AF_INET, SOCK_DGRAM, 0);if (_sockfd 0){cerr socket error: errno strerror(errno) endl;exit(errno);}// 2. 绑定 ip:portstruct sockaddr_in local;local.sin_family AF_INET;local.sin_addr.s_addr htonl(INADDR_ANY); // Address to accept any incomit message ------- 任意地址绑定// local.sin_addr.s_addr inet_addr(_ip.c_str()); // string --- uint32_t --- htonllocal.sin_port htons(_port);int n bind(_sockfd, (struct sockaddr*)local, sizeof(local));if (n 0){cerr bind error: errno strerror(errno) endl;exit(errno);}}void Start(){char buf[1024];while (true){struct sockaddr_in peer;socklen_t peer_len sizeof(peer);ssize_t n recvfrom(_sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr*)peer, peer_len);if (n 0){buf[n] 0;string client_ip inet_ntoa(peer.sin_addr); // 网络序列 --- 整型 --- 点分十进制uint16_t client_port ntohs(peer.sin_port); string message buf;cout client_ip [ client_port ]# message endl;_cb(_sockfd, client_ip, client_port, message);}}}private:string _ip;uint16_t _port;int _sockfd;func_t _cb; };// 聊天群在线用户静态全局变量 static OnlineUser g_online_users;// 处理messageserver与业务逻辑解耦 void RouteMessage(int sockfd, string client_ip, uint16_t client_port, string message) {if (message online)g_online_users.AddUser(client_ip, client_port);if (message offline)g_online_users.DelUser(client_ip, client_port);if (g_online_users.IsOnline(client_ip, client_port)){g_online_users.BroadcastMessage(sockfd, message, client_ip, client_port);}else{struct sockaddr_in client;bzero(client, sizeof(client));client.sin_family AF_INET;client.sin_addr.s_addr inet_addr(client_ip.c_str());client.sin_port htons(client_port);string response 你还没有登录请输入online登录加入聊天群;sendto(sockfd, response.c_str(), response.size(), 0, (struct sockaddr*)client, sizeof(client));} }void Usage() {cout Usage: \n\t server port endl;exit(1); }int main(int args, char* argv[]) {if (args ! 2)Usage();uint16_t port atoi(argv[1]);unique_ptrUdpServer udp_server(new UdpServer(RouteMessage, port));udp_server-Init();udp_server-Start();return 0; } client.cpp #include iostream #include cstdlib #include string #include cstring #include cerrno #include cassert #include functional #include pthread.h #include memory#include unistd.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h#include User.husing namespace std;class UdpClient { public:UdpClient(const string server_ip, const uint16_t server_port): _server_ip(server_ip), _server_port(server_port), _sockfd(-1), _quit(false){}void Init(){// 1. 创建套接字_sockfd socket(AF_INET, SOCK_DGRAM, 0);assert(_sockfd ! -1);cout socket seccess: _sockfd endl;// 2. 绑定bind不需要显示绑定由os分配}static void* ReadMessage(void* args){int sockfd *(static_castint*(args));pthread_detach(pthread_self()); // 线程分离while (true){char buf[1024];struct sockaddr_in tmp;socklen_t tmp_len sizeof(tmp);ssize_t n recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr*)tmp, tmp_len);if (n 0)buf[n] 0;cout \r buf \n;}return nullptr;}void Run(){pthread_create(_reader, nullptr, ReadMessage, (void*)_sockfd);struct sockaddr_in server;memset(server, 0, sizeof(server));server.sin_family AF_INET;server.sin_addr.s_addr inet_addr(_server_ip.c_str());server.sin_port htons(_server_port);string message;while (!_quit){fprintf(stderr, Enter:# );fflush(stderr);getline(cin, message);message[message.size()] 0;sendto(_sockfd, message.c_str(), message.size(), 0, (struct sockaddr*)server, sizeof(server));usleep(100);}}private:string _server_ip;uint16_t _server_port;int _sockfd;bool _quit;pthread_t _reader; };void Usage() {cout Usage: \n\t client ip port endl; }int main(int args, char* argv[]) {if (args ! 3)Usage();string server_ip argv[1];uint16_t server_port atoi(argv[2]);unique_ptrUdpClient udp_client(new UdpClient(server_ip, server_port));udp_client-Init();udp_client-Run();return 0; } 运行效果
http://www.zqtcl.cn/news/817500/

相关文章:

  • 网站后台批量上传图片ue5培训机构哪家强
  • 合肥制作网站在哪里建网站
  • 网站开发话术合同管理软件系统
  • 洛阳建设网站公司vue 微信公众号开发
  • 网页的网站建设什么网站可以做免费广告
  • 秦都区建设局网站网络推广如何收费
  • 户外保险网站网站开发市场情况
  • 嘉兴企业网站排名网站快速排名服务
  • 8步快速搭建个人网站视频网站备案号被收回
  • 沈阳网站建设 景乔科技wap入口
  • 做网站服务器要用多大怎么在58建设企业的网站
  • 购物网站用户管理景观设计公司资质
  • 县检察院门户网站建设情况门户网站衰落的原因
  • 菏泽网站建设哪好大型企业网络搭建
  • t恤定制网站厦门制作网站企业
  • 上海建站优化建设网站个人简介范文
  • 青岛网站建设公司排名做收集信息的网站
  • 有空间与域名后怎么做网站电影网站建设费用
  • 网站建设销售找客源app制作培训
  • ps制作网站产品图片ps平面设计主要做什么
  • 怎样更新网站泉州网站开发公司
  • 蕲春县住房和城乡建设局网站广东建设局网站首页
  • 网站优化工作室共享经济型网站开发
  • 自己做网站好还是购买网站好网站建设平台报价
  • 设计师配色网站太原建站模板源码
  • 学计算机的做网站的叫什么工作wordpress商用收费不
  • 青岛网站建设谁家好一些网页微信怎么登陆
  • 企业网站seo优做网站的旅行社
  • 十大免费自助建站上传网站到空间
  • 深圳企业做网站简约个人网站