C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)

简介: C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)

一、UDP编程

UDP特点:

   UDP的特点:不要连接,只管发送,数据因此不稳定,易丢包。      

   UDP与TCP不同之处:

       1>没有服务器跟客户端的观念

       2>没有accept和connect

       3>UDP实际对于网络需求略高一点

UDP框架:

发送端 :                                                  

           1>创建socket套接字                    

           2>绑定自己的IP地址和端口号            

           3>声明别人的IP地址和端口号            

           4>发送数据(函数有变化)                

接收端:

           1>创建socket套接字

           2>绑定自己的IP地址和端口号

           3>声明别人的IP地址和端口号

           4>接收数据(函数有变化)

UDP函数学习

1>sendto

           #include <sys/types.h>

           #include <sys/socket.h>

       int sendto(int sockfd, const void *buf, int len, unsigned int flags,

                   const struct sockaddr *dest_addr, int addrlen);

       功能:

           发送数据(用第五参数定位对方的IP地址和端口号)

       参数:

           sockfd:套接字

           buf:发送缓冲区

           len: 发送缓冲区的长度

           flags:默认为0

           dest_addr:结构体(包含目标的IP和端口号)

           addrlen:结构体的长度

       返回值:

           成功返回发送字节数

           失败,返回-1,并设置错误码

           

       2>recvfrom

           #include <sys/types.h>

           #include <sys/socket.h>

       int recvfrom(int sockfd, const void *buf, int len, unsigned int flags,

               const struct sockaddr *src_addr, socklen_t *addrlen);

       功能:

           接收数据(用第五参数定位对方的IP地址和端口号)

       参数:

           sockfd:套接字

           buf:接收缓冲区

           len: 接收缓冲区的长度

           flags:默认为0

           src_addr:结构体(包含目标的IP和端口号)

           addrlen:结构体的长度的指针

       返回值:

           成功返回接收字节数

           失败,返回-1,并设置错误码

发送端代码案例如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int main(int argc,char *argv[])
{
  if(argc<5)
  {
    printf("请输入<./可执行> <自己IP> <自己端口号> <目标IP> <目标端口号>\n");
    return -1;
  }
  //1>创建socket套接字
  int sfd;
  sfd = socket(AF_INET,SOCK_DGRAM,0);//注意换UDP类型
  if(sfd<0)
  {
    perror("socket");
    return -1;
  }
  //2>绑定自己的IP和端口号
  struct sockaddr_in myself;
  myself.sin_family = AF_INET;
  myself.sin_port = htons(atoi(argv[2])); //9000
  myself.sin_addr.s_addr = inet_addr(argv[1]);
  if(bind(sfd,(struct sockaddr *)&myself,sizeof(myself))<0)
  {
    perror("bind");
    return -1;
  }
  //3>声明别人的IP和端口号
  struct sockaddr_in other;
  other.sin_family = AF_INET;
  other.sin_port = htons(atoi(argv[4]));  //8888
  other.sin_addr.s_addr = inet_addr(argv[3]);
  //4>发送数据
  char buf[50];
  while(1)
  {
    bzero(buf,sizeof(buf));
    scanf("%s",buf);
    sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&other,sizeof(other));
  }
  close(sfd);
  return 0;
}

接收端代码案例如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int main(int argc,char *argv[])
{
  if(argc<5)
  {
    printf("请输入<./可执行> <自己IP> <自己端口号> <目标IP> <目标端口号>\n");
    return -1;
  }
  //1>创建socket套接字
  int sfd;
  sfd = socket(AF_INET,SOCK_DGRAM,0);//注意换UDP类型
  if(sfd<0)
  {
    perror("socket");
    return -1;
  }
  //2>绑定自己的IP和端口号
  struct sockaddr_in myself;
  myself.sin_family = AF_INET;
  myself.sin_port = htons(atoi(argv[2]));  //8888
  myself.sin_addr.s_addr = inet_addr(argv[1]);
  if(bind(sfd,(struct sockaddr *)&myself,sizeof(myself))<0)
  {
    perror("bind");
    return -1;
  }
  //3>声明别人的IP和端口号
  struct sockaddr_in other;
  other.sin_family = AF_INET;
  other.sin_port = htons(atoi(argv[4]));  //9000
  other.sin_addr.s_addr = inet_addr(argv[3]);
  //4>接受数据
  char buf[50];
  int len = sizeof(other);
  while(1)
  {
    bzero(buf,sizeof(buf));
    recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&other,&len);
    printf("发送方说:%s\n",buf);
  }
  close(sfd);
  return 0;
} 

二、多路复用

前提讲述

IO阻塞和IO非阻塞

   int fcntl(int fd, int cmd, long arg); //改变文件描述符的特性

     int flag;

     flag = fcntl(sockfd, F_GETFL, 0);//F_GETFL获取文件描述符的特性

     flag |= O_NONBLOCK;//配置非阻塞

     fcntl(sockfd, F_SETFL, flag);//设置文件描述符特性为非阻塞

select

select
        int select(int nfds, fd_set *readfds, fd_set *writefds,
                fd_set *exceptfds, struct timeval *timeout);
        功能:就是将你要关心的文件描述符放入一个集合中,将这个集合交给内核判断,当集合中
                某个文件描述符被触发时,解除阻塞。        
        参数:
            nfds:最大文件描述符+1
            readfds:读集合
            writefds:写集合
            exceptfds:异常集合
            timeout:超时时间
        返回值:
            成功返回那个被触发的文件描述符
            失败,返回-1,并设置错误码
        struct timeval {
               long    tv_sec;         /* seconds */     秒
               long    tv_usec;        /* microseconds */ 微妙
           };    
           
           void FD_ZERO(fd_set *fdset)  清除文件描述符集合
            void FD_SET(int fd,fd_set *fdset)     将你要关心的文件描述符放入集合中
            void FD_CLR(int fd,fd_set *fdset)     将文件描述符移除集合
            int FD_ISSET(int fd,fd_set *fdset)     判断文件描述符是否在集合中
           
           fd_set是一个数据类型,本质是一个字节数组。长度为1024.
           readfds:读集合,往读集合放入我们关心的0,serfd描述符
           当select解除阻塞,说明这两个文件描述符有一个被触发了。
           一旦有文件描述符被触发,将移除集合中未触发的。再利用FD_ISSET去判断

             

poll

poll
        #include <poll.h>
        int poll(struct pollfd* fds, nfds_t nfds, int timeout)
        功能:
            多路复用,看哪个文件描述符就绪,做对应操作,看结构体第三参数是否被内核改变
        参数:
            fds:结构体数组,记
            nfds:要判断的文件描述符个数
            timeout:超时时间,0表示不阻塞;>0,阻塞的时间;默认设置为-1表示阻塞
        返回值:
            成功返回0
            失败返回-1,并设置错误码
        struct pollfd {
            int     fd;            // 委托内核检测的文件描述符                你希望监听文件描述符0  用户设置
            short   events;        // 委托内核检测文件描述符的什么事件        监听它被触发,也就是有数据可读POLLIN 用户设置
            short     revents     // 文件描述符实际发生的事件             内核设置
        }

三、图解如下


总结

关于C/C++网络编程基础知识超详细讲解第二部分的详解,懒大王就先分享到这里了,如果你认为这篇文章对你有帮助,请给懒大王点个赞点个关注吧,如果发现什么问题,欢迎评论区留言!!💕💕

相关文章
|
3月前
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
4月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
268 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
2月前
|
小程序 UED
拓展校友网络的创新解决方案:校园论坛圈子小程序+跑腿+二手市场系统
这是一款基于小程序的校园跑腿服务平台,支持多种注册登录方式、下单支付、跑腿接单配送、订单跟踪评价及物流查询功能,并配备客服模块提升用户体验。系统包含用户、客服、物流、跑腿员和订单五大核心模块,功能完善。此外,平台还拓展了校友网络功能,如信息咨询发布、校园社区建设和活动组织等,旨在增强校友互动与联系,形成紧密的校友生态。
85 4
|
3月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
害虫识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了12种常见的害虫种类数据集【"蚂蚁(ants)", "蜜蜂(bees)", "甲虫(beetle)", "毛虫(catterpillar)", "蚯蚓(earthworms)", "蜚蠊(earwig)", "蚱蜢(grasshopper)", "飞蛾(moth)", "鼻涕虫(slug)", "蜗牛(snail)", "黄蜂(wasp)", "象鼻虫(weevil)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Djan
217 1
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
3月前
|
前端开发 Java 关系型数据库
基于ssm的网络直播带货管理系统,附源码+数据库+论文
该项目为网络直播带货网站,包含管理员和用户两个角色。管理员可进行主页、个人中心、用户管理、商品分类与信息管理、系统及订单管理;用户可浏览主页、管理个人中心、收藏和订单。系统基于Java开发,采用B/S架构,前端使用Vue、JSP等技术,后端为SSM框架,数据库为MySQL。项目运行环境为Windows,支持JDK8、Tomcat8.5。提供演示视频和详细文档截图。
107 10
|
4月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
262 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
4月前
|
机器学习/深度学习 编解码 测试技术
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型
209 4
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型
|
4月前
|
机器学习/深度学习 编解码 测试技术
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型
387 8
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型
|
4月前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
100 15
|
4月前
|
搜索推荐 数据挖掘
优质网络舆情监测系统大盘点
一款出色的网络舆情监测系统,不仅能够助力相关主体迅速捕捉舆情信息,有效应对危机,还能够助力其更好地把握舆论动态,维护自身形象。那么,市场上有哪些比较好的网络舆情监测系统呢?这里,本文有为各位整理了一些好用的舆情检测系统,以供各位参考!
160 0

热门文章

最新文章