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

这篇具有很好参考价值的文章主要介绍了C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

           懒大王感谢大家的关注和三连支持~      

目录

前言

一、UDP编程

UDP特点:

 UDP框架:

UDP函数学习 

 发送端代码案例如下:

二、多路复用 

前提讲述

select 

poll

三、图解如下 

总结        


前言

作者简介: 懒大王敲代码,正在学习嵌入式方向有关课程stm32,网络编程,数据结构C/C++等

今天给大家继续详细讲解网络编程基础知识,希望能够帮到大家!
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 


一、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++网络编程基础知识超详细讲解第二部分(系统性学习day12),网络编程学习,学习,c语言,c#,开发语言


总结

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

到了这里,关于C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习网络编程No.1【网络基础知识】

    北京时间:2023/8/4/22:40,天苍苍野茫茫,风吹造地见牛羊,此时心潮澎湃,非常开心,啊哈哈哈!因为就在刚刚我们终于把系统编程方面的知识给学完了,啊哈哈哈!真是功夫不负有心人呀!呜呜呜,仰天而泣,算了,不能发神经,哈哈!今天把最后一节有关多线程知识的课

    2024年02月14日
    浏览(38)
  • 网络基础知识&socket编程

    Linux 系统是依靠互联网平台迅速发展起来的,所以它具有强大的网络功能支持,也是Linux 系统的一大特点。互联网对人类社会产生了巨大影响,它几乎改变了人们生活的方方面面,可见互联网对人类社会的重要性! 本章我们便来学习一些网络基础知识,如果感兴趣的读者可以

    2024年02月10日
    浏览(33)
  • 一、网络编程之基础知识详解

    引言: 初学网络编程时会涉及到许多网络基础知识,这些知识点比较零碎,本文希望系统总结一次,以便在后续的学习和工作中能够快速查阅。 网络分层模型 OSI 七层模型 OSI 模型,也叫做七层模型, OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”。 OSI 模型是

    2024年02月09日
    浏览(45)
  • 《Java SE》网络编程基础知识归纳。

    目录 一、网络基本介绍 1、什么是网络通信? 2、网络 3、IP地址 4、域名 5、网络通信协议 6、Socket 二、TCP网络通信编程  1、应用实例1(字节流) 2、应用实例2(字节流) 3、应用实例3(字符流) 4、netstat 指令 三、UDP网络通信编程  1、基本介绍 2、基本流程 3、应用实例  

    2024年01月20日
    浏览(39)
  • 《3.linux应用编程和网络编程-第8部分-3.8.网络基础》 3.8.1.网络通信概述 3.8.3.网络通信基础知识2

        进程间通信: 管道 、 信号量、 共享内存, 技术多,操作麻烦     线程就是解决 进程间 通信 麻烦的事情,这是线程的 优势 3.8.1.网络通信概述 3.8.1.1、从进程间通信说起: 网络域套接字socket , 网络通信其实就是位于网络中不同主机上面                   的 

    2024年02月15日
    浏览(36)
  • 由浅入深Netty基础知识NIO网络编程

    阻塞模式下,相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停 SocketChannel.read 会在没有数据可读时让线程暂停 阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置 单线程下,阻塞方法之间相互影响,几乎不能正常工作,

    2024年02月05日
    浏览(41)
  • Python网络编程(一)——了解IP和端口的基础知识以及socket的简单实现

    Python网络编程(一)——了解IP和端口的基础知识以及socket的简单实现 IP(Internet Protocol) 地址是唯一标识互联网上连接至计算机或其他设备的地址。每一个设备在 IP 网络中拥有一个不同的 IP 地址,它由 32 位二进制数组成,通常表示为四个从 0 到 255 的十进制数之间用 (.)

    2024年02月04日
    浏览(45)
  • C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

    流式套接字编程针对TCP协议通信,即是面向对象的通信,分为服务端和客户端两部分。 1)加载套接字库( 使用函数WSAStartup() ),创建套接字( 使用socket() ) 2)绑定套接字到一个IP地址和一个端口上( 使用函数bind() ) 3)将套接字设置为监听模式等待连接请求( 使用函数

    2024年02月03日
    浏览(34)
  • Android webrtc实战(一)录制本地视频并播放,附带详细的基础知识讲解

    目录 一、创建PeerConnectionFactory 初始化 构建对象 二、创建AudioDeviceModule AudioDeviceModule JavaAudioDeviceModule 构建对象 setAudioAttributes setAudioFormat setAudioSource 创建录制视频相关对象 创建VideoSource 创建VideoCapturer 创建VideoTrack 播放视频 切换前后置摄像头 别忘了申请权限 完整代码 本系列

    2024年02月16日
    浏览(39)
  • C/C++ stm32基础知识超详细讲解(系统性学习day14)

    目录 前言 一、ARM和STM32是什么? 二、STM32的开发方式 三、GPIO----寄存器开发方式 1.八种输入输出模式分析 2.寄存器  四、stm32芯片图片 五、怎么学好stm32  总结 stm32的广泛含义及背景: STM32是一款由意法半导体(ST)公司开发的32位微控制器,其全称是意法半导体32位系列微控

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包