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

织梦 网站地图360免费wifi下载安装

织梦 网站地图,360免费wifi下载安装,十大景观设计公司,wordpress调用图片目录 1、实现服务器的逻辑 1.1 socket 1.2 bind 1.3 recvfrom 1.4 sendto 1.5 服务器代码 2、实现客户端的逻辑 2.1 客户端代码 3、实现通信 结语 前言#xff1a; 在Linux下#xff0c;实现传输层协议为UDP的套接字进行网络通信#xff0c;网络层协议为IPv4 在Linux下实现传输层协议为UDP的套接字进行网络通信网络层协议为IPv4需要用到的接口有以下4个socket、bind、recvfrom、sendto。具体实现方法在云服务器上创建一个服务器进程和一个客户端进程让客户端向服务器发送消息并且服务器收到消息后可以反馈给对方。 示意图如下 1、实现服务器的逻辑 按照以下函数的调用顺序即可实现服务器方的UDP通信。 1.1 socket 首先明确使用IPv4协议和UDP协议后先调用接口socket让其返回一个网络文件描述符给到我们socket函数介绍如下 #include sys/types.h #include sys/socket.hint socket(int domain, int type, int protocol); //domain表示网络协议族AF_INET为IPv4AF_INET6为IPv6 //type表示传输层协议SOCK_STREAM为TCPSOCK_DGRAM为UDP //protocol表示指定特定的协议一般前两个参数的协议足矣这里填0即可//调用成功返回一个类型文件描述符的网络描述符失败返回-1 1.2 bind 定义一个struct sockaddr_in类型的变量该变量的作用是为调用bind接口做准备该变量里面有3个信息需要填写分别是1、传输层协议2、为该进程设置的端口号3、该主机的IP地址。其中端口号和IP地址需要对其转换成大端字节序因为网络规定传输的数据采用大端字节序传输这里介绍两个接口可以帮助我们直接将端口号和IP转换成大端字节序接口介绍如下 #include arpa/inet.huint16_t htons(uint16_t hostshort);//常用来转换端口号 //将主机字节序转换成网络字节序并返回#include arpa/inet.h unsigned long inet_addr(const char *cp);//常用来转换IP地址 //如果cp指向的是IP地址的字符串形式那么会将其转换为网络字节序的IP地址 //并且以无符号的长整型返回待struct sockaddr_in类型的变量的字段填写完毕后下一步就是进行绑定操作绑定的目的是将socket返回的网络描述符与struct sockaddr_in类型的变量进行绑定即可以通过网络描述符来找到对应的ip地址以及端口号简单来说通过网络描述符就能找到对应主机的对应进程。 接着就是调用bind接口进行绑定了bind接口介绍如下 int bind(int socket, const struct sockaddr *address,socklen_t address_len); //socket表示要绑定的网络描述符 //address表示指向struct sockaddr类型的变量 //address_len表示address指向变量的大小//调用成功返回0失败返回-1 1.3 recvfrom recvfrom接口有点类似文件操作中的read接口都带有接收的意思。recvfrom接口用于从网络描述符中读取对方主机发送的数据并且还可以将对方主机的地址信息IP和端口号给记录下来该接口的介绍如下 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); //sockfd表示读取的网络描述符 //buf表示存放读取数据的目标缓冲区 //len表示期望读取内容的大小 //flag表示设置该函数的模式比如阻塞或非阻塞通常设为0表阻塞 //src_addr是个输出型参数用于保存发送方的地址信息 //addrlen表示src_addr指向变量的大小//成功返回接收的字节数若sockfd关闭返回0失败返回-1 1.4 sendto 如果说recvfrom接口类似read接口那么sendto就好比write接口他能够往网络文件描述符内写入数据即发送方就是调用sendto接口向接收方发送数据sendto和recvfrom相互搭配实现网络通信。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表示要发送数据的长度 //flag表示设置该函数的模式比如阻塞或非阻塞通常设为0表阻塞 //dest_addr指向的结构体里包含接收方的IP和端口号依靠他们才能找到接收方 //addrlen表示dest_addr指向结构体的大小 1.5 服务器代码 将服务器封装成一个类并把服务器的端口号、ip地址、网络描述符作为该类的成员变量这样就可以对上述功能逻辑进行分层了服务器类代码如下 #pragma once#include iostream #include string #include strings.h #include cstring #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include cstdio #include unistd.h using namespace std;uint16_t defaultport 8080; std::string defaultip 0.0.0.0; const int size 1024;class UdpServer{ public:UdpServer(const uint16_t port defaultport, const std::string ip defaultip):sockfd_(0), port_(port), ip_(ip){}void Init(){// 1. 创建udp socketsockfd_ socket(AF_INET, SOCK_DGRAM, 0); printf(socket create success, sockfd: %d\n, sockfd_);// 2. bind socketstruct sockaddr_in local;bzero(local, sizeof(local));local.sin_family AF_INET;local.sin_port htons(port_); local.sin_addr.s_addr inet_addr(ip_.c_str()); bind(sockfd_, (const struct sockaddr *)local, sizeof(local));printf(bind success, errno: %d, \err string: %s\n, errno, strerror(errno));}void Run() // 对代码进行分层{char inbuffer[size];while(true){struct sockaddr_in client;socklen_t len sizeof(client);//服务器先接收消息ssize_t n recvfrom(sockfd_, inbuffer, sizeof(inbuffer) - 1,0, (struct sockaddr*)client, len);cout客户端说:inbufferendl;inbuffer[n] 0;std::string info inbuffer;std::string echo_string 服务器的回答info;//再反馈消息sendto(sockfd_, echo_string.c_str(), echo_string.size(), 0, (const sockaddr*)client, len);}}~UdpServer(){if(sockfd_0) close(sockfd_);//关闭描述符} private:int sockfd_; // 网路文件描述符std::string ip_; // ip地址uint16_t port_; // 服务器端口号 }; 该服务器的逻辑是先接收客户端发送的消息然后利用recvfrom函数保存客户端的地址信息再使用sendto函数对客户端进行信息的反馈。 2、实现客户端的逻辑  客户端逻辑和服务器逻辑几乎一样第一步必须调用socket创建网络描述符但是第二步客户端不需要进行bind绑定因为服务器之所以需要绑定是因为服务器必须手动自定义一个端口号目的就是要让该端口号可见以便让客户端知道该端口号这样客户端才能通过该端口号定位服务器。而客户端不需要自定义端口号因为客户端的主要任务是给服务器发送信息这个过程服务器是不需要知道客户端的端口号也可以接收客户端的信息因此客户端的端口号只需要保证其唯一性即可即交给操作系统来生成当首次发送数据的时候操作系统就会为客户端生成端口号。 2.1 客户端代码 客户端代码如下 #include iostream #include cstdlib #include unistd.h #include strings.h #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.husing namespace std;void Usage(std::string proc) {std::cout \n\rUsage: proc serverip serverport\n std::endl; }// ./udpclient serverip serverport int main(int argc, char *argv[]) {if (argc ! 3){Usage(argv[0]);exit(0);}//从命令行参数拿到ip地址和端口号std::string serverip argv[1];uint16_t serverport std::stoi(argv[2]);struct sockaddr_in server;bzero(server, sizeof(server));server.sin_family AF_INET;server.sin_port htons(serverport); //转换网络字节序server.sin_addr.s_addr inet_addr(serverip.c_str());//转换网络字节序// 1. socket拿到网络描述符int sockfd socket(AF_INET, SOCK_DGRAM, 0);socklen_t len sizeof(server);string message;char buffer[1024];while (true){cout Please Enter ;getline(cin, message);//2. 向服务器发送信息sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)server, len);struct sockaddr_in temp;socklen_t len sizeof(temp);//3. 打印来自服务器的信息recvfrom(sockfd, buffer, 1023, 0, (struct sockaddr*)temp, len);cout buffer endl;}close(sockfd);//关闭文件描述符return 0; } 3、实现通信 实现通信的前提是让服务器以进程的形式跑起来然后再让客户端也以进程的形式跑起来因为网络通信的本质就是进程间通信而上述代码中客户端本身就是在main函数中执行的所以此时客户端可以直接运行但是服务器还只是个类因此现在只需要用服务器类实现一个main函数即可完成两个进程的运行。 服务器进程代码如下  #include UDPser.hpp #include memory #include cstdiovoid Usage(std::string proc) {std::cout \n\rUsage: proc port[1024]\n std::endl; }// ./udpserver port int main(int argc, char *argv[]) {if(argc ! 2){Usage(argv[0]);exit(0);}//从命令行参数拿到端口号uint16_t port std::stoi(argv[1]);std::unique_ptrUdpServer svr(new UdpServer(port));svr-Init();svr-Run();return 0; } 运行结果 从结果可以看到目前可以正常的进行客户端与服务器之间的通信。 结语  以上就是关于实现UDP网络通信的讲解实现UDP的核心在于对套接字的理解以及相关接口的逻辑使用其实只需要记住只要涉及到网络通信那么socket和bind函数是必须在最开始就调用的。 最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充谢谢大家
http://www.w-s-a.com/news/17262/

相关文章:

  • 建设银行河北分行招聘网站哪里能找到网站
  • 兰州营销型网站网站建设收费标准
  • 网站首页动图怎么做自己做网站很难
  • 自建网站如何盈利推广引流最快的方法
  • 网页设计网站结构图怎么弄网站用户 分析
  • 企业手机网站建设策划天津网页设计工作
  • 苏州vr全景网站建设公司怎么讲解网页的制作技术
  • 徐州智能建站怎么做苏州建设网站首页
  • 网站支付功能报价wordpress主页透明
  • asia域名的网站宁波模板建站源码
  • 官网网站怎么做个人网站盈利
  • 青龙桥网站建设网站同时做竞价和优化可以
  • 沭阳建设网站婴儿辅食中企动力提供网站建设
  • 常州做网站的公司济宁网站建设seo
  • 用wordpress做企业网站视频教程韶关建设网站
  • 怎么做一个免费的网站云南网站设计选哪家
  • dw做六个页面的网站做网站运营有前途吗
  • 中级网站开发工程师 试题战地之王网站做任务
  • 广东东莞保安公司湖南 seo
  • 无锡网站策划公司如何零基础学编程
  • 金融网站如何做设计网站开发流程 文档
  • 用jsp做网站国内知名设计工作室
  • 一键搭建网站北京公司网站设计
  • 山东省城乡建设部网站网站营销单页怎么做
  • 中国移动视频网站建设百度统计官网
  • 网站实施过程网站上传视频怎么做
  • 网上书店网站建设实训总结嘉兴seo
  • 网站运行需求cos wordpress
  • 网络小说网站推广策划方案单位网站建设收费标准
  • 医院网站建设论证报告河源网站seo