返回顶部
首页 > 资讯 > 操作系统 >MFC网络编程简单例程
  • 323
分享到

MFC网络编程简单例程

mfc网络 2023-08-30 15:08:12 323人浏览 泡泡鱼
摘要

目录 一、关于网络的部分概念1 URL(网址)及URL的解析2 URL的解析3 域名及域名解析3 IP及子网掩码4 什么是Web服务器5 HTTP的基本概念6 Socket库概念7 协议栈8 Socket库收发数据基本步骤 二、

一、关于网络的部分概念

1 URL(网址)及URL的解析

 网址:学名叫URL(UnifORM Resource Locator),统一资源定位符。URL的各种形式如下图所示。
在这里插入图片描述
 尽管URL有各种不同的写法,但他们有一个共同点,就是URL开头的文字,即“Http:”“ftp:”“file:”"mailto:"这部分文字标识浏览器应当使用的访问方法。比如当访问WEB服务器时应当使用HTTP协议,而访问FTP服务器时应当使用FTP协议。因此,我们可以把这部分理解为访问时使用的协议类型。

2 URL的解析

 浏览器先要解析URL,从而生成发送给Web服务器的请求消息。以下我们以访问Web服务器为例进行讲解,假定URL为http://www.lab.glasscom.com/dir1/file1.html ,经过浏览器解析之后,可以看到拆分结果为:Web服务器名称www.lab.glasscom.com,以及文件的路径名/dir1/file1.html
在这里插入图片描述
在这里插入图片描述

3 域名及域名解析

 一般来说,域名包括顶级域名、一级域名、子域名组成,其格式为www.A.B.C.com,句点划分了域名的层次结构,越靠右的域(如com)的层次越高。假设DNS服务器和域一一对应(实际上比较复杂),则上层域的DNS服务器保存着下级服务器的信息,因此可以一层一层顺藤摸瓜地查找下去。
在这里插入图片描述
 对地址为 http://www.lab.glasscom.com/dir1/file1.html 的URL来说,其中的www.lab.glasscom.com就是域名。
 当我们在浏览器输入一个域名后,需要进行域名解析,也就是通过操作系统Socket库中的解析器向最近的DNS服务器查询域名对应的IP地址,获得此地址后,我们才能同该服务器进行通信。

3 IP及子网掩码

互联网和公司内部的局域网都是基于tcp/IP的思路来设计的,也就是由一些小的子网,通过路由器连接起来组成一个大的网络。这里的子网可以理解为用集线器连接起来的几台计算机,我们将它看作一个单位,成为子网。将子网通过路由器连接起来,就形成了一个网络。在网络中,所有的设备都会被分配一个地址。这个地址就相当于现实中某条路上的“XX号XX室”。其中“号”对应的号码是分配给整个子网的,而“室”对应的号码室分配给子网中的计算机的,这就是网络中的地址。“号”对应的号码称为网络号,“室”对应的号码称为主机号,这个地址的整体称为IP地址。
 准确的说,IP地址是连接在Internet中的每一台主机(或 路由器)的全球唯一的标识符。实际的IP地址是一串32比特的数字,按照8比特为一组分成4组,分别用十进制标识然后再用原点隔开。但是这样我们就无法区分哪些是网络号,哪些是主机号。为此,我们附加了子网掩码。
在这里插入图片描述
 子网掩码为1的部分表示网络号,子网掩码为0的部分表示主机号,如下图所示。
在这里插入图片描述

4 什么是Web服务器

  Web服务器一般指的是“网站服务器”,也称为WWW(Word Wide Web)服务器,是某种驻留在因特网上的计算机程序,可以向请求终端提供服务,主要功能时存储、处理和传递网页给“客户”,传递内容一般是HTML文档、图像、样式表或脚本等,也可以放置网站文件以供浏览或下载。严格来说Web服务器只负责处理Http协议请求,发送静态页面的内容。

5 HTTP的基本概念

 在浏览器解析完URL之后,就会使用HTTP协议访问Web服务器。那么HTTP协议到底是什么?
在这里插入图片描述
 HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤,其基本思路非常简单。首先,客户端会向服务器发送请求消息。请求消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。其中相当于“对什么”的部分称为 URI。一般来说,URI 的内容是一个存放网页数据的文件名或者是一个 CGI 程序的文件名,例如“/dir1/file1.html” “/dir1/program1.cgi”等。不过,URI 不仅限于此,也可以直接使用“http:”开头的 URL 来作为 URI。换句话说就是,这里可以写各种访问目标,而这些访问目标统称为 URI。
 相当于接下来“进行怎样的操作”的部分称为方法。方法表示需要让Web 服务器完成怎样的工作,其中典型的例子包括读取 URI 表示的数据、将客户端输入的数据发送给 URI 表示的程序等。下表列举了主要的方法,通过这张表大家应该能够理解通过方法可以执行怎样的操作。
在这里插入图片描述
 HTTP 消息中还有一些用来表示附加信息的头字段。客户端向 Web 服务器发送数据时,会先发送头字段,然后再发送数据。收到请求消息之后,Web 服务器会对其中的内容进行解析,通过 URI和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。在响应消息的开头有一个状态码,它用来表示操作的执行结果是成功还是发生了错误。当我们访问 Web 服务器时,遇到找不到的文件就会显示出 404 Not Found 的错误信息,其实这就是状态码。状态码后面就是头字段和网页数据。响应消息会被发送回客户端,客户端收到之后,浏览器会从消息中读出所需的数据并显示在屏幕上。到这里,HTTP 的整个工作就完成了。

6 Socket库概念

 Socket库是操作系统提供的一个库,包含的程序组件可以让其他的程序调用操作系统的网络功能。如域名解析器就是库中的一个组件。
 当浏览器和 Web 服务器通信时、通过 DNS 服务器查询 IP 地址时,都需要使用 Socket 库中的程序组件。
 使用 Socket 库来收发数据的操作过程如下图所示 。简单来说,收发数据的两台计算机之间连接了一条数据通道,数据沿着这条通道流动,最终到达目的地。我们可以把数据通道想象成一条管道,将数据从一端送入管道,数据就会到达管道的另一端然后被取出。数据可以从任何一端被送入管道,数据的流动是双向的。不过,这并不是说现实中真的有这么一条管道,只是为了帮助大家理解数据收发操作的全貌。
在这里插入图片描述

7 协议栈

 协议栈是指操作系统中的网络控制软件,协议栈的内部结构为:
在这里插入图片描述
 图中最上面的部分是网络应用程序,也就是浏览器、电子邮件客户端、Web 服务器、电子邮件服务器等程序,它们会将收发数据等工作委派给下层的部分来完成。当然,除了浏览器之外,其他应用程序在网络上收发数据的操作也都是类似上面这样的,也就是说,尽管不同的应用程序收发的数据内容不同,但收发数据的操作是共通的。
 应用程序的下面是 Socket 库,其中包括解析器,解析器用来向 DNS服务器发出查询。再下面就是操作系统内部了,其中包括协议栈。协议栈的上半部分有两块,分别是负责用 TCP 协议收发数据的部分和负责用 UDP 协议收发数据的部分,它们会接受应用程序的委托执行收发数据的操作。
 TCP 和UDP是面向传输层的两种协议;像浏览器、邮件等一般的应用程序都是使用 TCP 收发数据的,而像 DNS 查询等收发较短的控制数据的时候则使用 UDP。
 总的来说,上层向下层发出指令,下层执行上层指令;应用程序调用Socket库,Socket库调用了协议栈,协议栈又调用了网卡驱动程序,最终将消息发送出去。

8 Socket库收发数据基本步骤

 利用socket收发数据的操作分为若干个阶段,可以大致总结为以下 4 个。
  1.创建套接字(创建套接字阶段)
  2.将管道连接到服务器端的套接字上(连接阶段)
  3.收发数据(通信阶段)
  4.断开管道并删除套接字(断开阶段)

客户端和服务器之间收发数据操作的情形
在这里插入图片描述

二、基于TCP的网络应用程序

 基于TCP(面向连接)的socket编程的服务器端程序流程如下:

  1. 创建套接字(socket)
  2. 将套接字绑定到一个本地地址和端口上(bind)
  3. 将套接字设为监听模式,准备接受客户请求(listen)
  4. 等待客户请求到来;当请求到来时,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
  5. 用返回的套接字和客户端进行通信(send/recv).
  6. 返回,等待另一客户请求。
  7. 关闭套接字

 基于TCP(面向连接)的socket编程的客户端程序流程如下:

  1. 创建套接字(socket).
  2. 向服务器发出连接请求(connect).
  3. 和服务器进行通信(send/recv).
  4. 关闭套接字。

 服务器端的实现为

// TCPSrv.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include #include #include //#define _WINSOCK_DEPRECATED_NO_WARNINGS#pragma comment(lib, "Ws2_32.lib")int main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(2, 2);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0) {return EXIT_SUCCESS;}if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2) {WSACleanup();return EXIT_SUCCESS;}//第一步:创建套接字SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//第二步:将套接字绑定到本地地址和端口上SOCKADDR_IN addSrv;//使用网络字节序,可以将IP地址指定为INADDR_ANY,允许套接字向任何分配给//本地机器的IP地址发送或接受数据。//如果我们想让套接字使用多个IP中的一个地址,就必须指定实际地址,这需要用到//inet_addr函数来实现addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addSrv.sin_family = AF_INET;addSrv.sin_port = htons(6000);bind(sockSrv, (SOCKADDR*)&addSrv, sizeof(SOCKADDR));//绑定套接字//第三步:将套接字设为监听模式,准备接受客户请求,//第二个参数是指等待连接队列的最大长度,比如说此时等待连接队列是5,那么下一个连接请求会被拒绝listen(sockSrv, 5);SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);while (true){//第四步:等待客户连接到来//accept 函数提取套接字 s 上挂起连接队列上的第一个连接。然后,它会创建一个新的套接字,并将其句柄并将其返回。//新创建的套接字是将处理实际连接的套接字;它具有与套接字相同的属性,包括使用 WSAAsyncSelect 或 WSAEventSelect 函数注册的异步事件。SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);char sendBuf[100];sprintf_s(sendBuf, "Welcome %s to http://www.sunxin.org", inet_ntoa(addrClient.sin_addr));//第五步:用返回的套接字和客户端通信//发送数据,为了让接收端在接受数据以后,可以在该数据字符串之后增加一个“\0”结尾标志send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);char recvBuf[100];//接收数据recv(sockConn, recvBuf, 100, 0);//打印接受到的数据printf("%s\n", recvBuf);//第六步:关闭套接字,此时程序进入到下一循环closesocket(sockConn);}}

 客户端的实现如下

// TCPClient.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include #include #include #pragma comment(lib, "Ws2_32.lib")int main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(2, 2);//加载套接字库err = WSAStartup(wVersionRequested, &wsaData);if (err != 0) {return EXIT_SUCCESS;}if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2) {WSACleanup();return EXIT_SUCCESS;}//第一步:创建套接字SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);//第二部:向服务器发送连接请求SOCKADDR_IN addrSrv;//地址127.0.0.1 是本地回路地址。主机环回是指地址为 127.0.0.1 的任何数据包//都不应该离开计算机(主机),发送它——而不是被发送到本地网络或互联网,它只是被自己“环回”,//并且发送数据包的计算机成为接收者。addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//第三步:和服务器进行通信//接受数据char recvBuf[100];recv(sockClient, recvBuf, 100, 0);printf("%s\n", recvBuf);//发送数据send(sockClient, "This is lisi", strlen("This is lisi") + 1, 0);//第四步:关闭套接字closesocket(sockClient);//释放资源WSACleanup();getchar();}

三、基于UDP的网络应用程序

 基于UDP(面向无连接)的socket编程的服务器端程序流程如下:

  1. 创建套接字(socket)
  2. 将套接字绑定到一个本地地址和端口上(bind)
  3. 等待接受数据(recvfrom)
  4. 关闭套接字

基于UDP(面向无连接)的socket编程的客户端程序流程如下:

  1. 创建套接字(socket).
  2. 向服务器发送数据(sendto).
  3. 关闭套接字。

  注意,在基于UDP的套接字编程时,利用的是sendto和recvfrom两个函数;而基于TCP的套接字编程时,发送和接受分别使用send和recv函数。
  服务器端的程序实现如下:

// UDPSrv.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include #include #include #pragma comment(lib, "Ws2_32.lib")int main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(2, 2);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0) {return EXIT_SUCCESS;}if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2) {WSACleanup();return EXIT_SUCCESS;}//第一步:创建套接字SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);//第二步:将套接字绑定到一个本地地址和端口上SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//第三步:等待接收数据SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);char recvBuf[100];recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);printf("%s\n", recvBuf);//第四步:关闭套接字closesocket(sockSrv);WSACleanup();getchar();}

 客户端的程序实现如下:

// UDPClient.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include #include #include #pragma comment(lib, "Ws2_32.lib")int main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(2, 2);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0) {return EXIT_SUCCESS;}if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2) {WSACleanup();return EXIT_SUCCESS;}//第一步:创建套接字SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);//第二步:向服务器发送数据(sendto)sendto(sockClient, "Hell0", strlen("Hello") + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//第三步:关闭套接字closesocket(sockClient);WSACleanup();getchar();}

来源地址:https://blog.csdn.net/mary288267/article/details/132426509

--结束END--

本文标题: MFC网络编程简单例程

本文链接: https://lsjlt.com/news/383148.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MFC网络编程简单例程
    目录 一、关于网络的部分概念1 URL(网址)及URL的解析2 URL的解析3 域名及域名解析3 IP及子网掩码4 什么是Web服务器5 HTTP的基本概念6 Socket库概念7 协议栈8 Socket库收发数据基本步骤 二、...
    99+
    2023-08-30
    mfc 网络
  • python网络编程--socket简单
    python网络编程                                                                                                              ...
    99+
    2023-01-31
    网络编程 简单 python
  • python 网络编程详解及简单实例
    python 网络编程详解 网络编程的专利权应该属于Unix,各个平台(如windows、Linux等)、各门语言(C、C++、Python、Java等)所实现的符合自身特性的语法都大同小异。在我看来,懂得...
    99+
    2022-06-04
    详解 网络编程 实例
  • java编程实现简单的网络爬虫示例过程
    本项目中需要用到两个第三方jar包,分别为 jsoup 和 commons-io。 jsoup的作用是为了解析网页, commons-io 是为了把数据保存到本地。 1.爬取贴吧 第...
    99+
    2024-04-02
  • android网络编程之android连接网络的简单示例代码
    代码如下:private void callToWebSrvice() {    ConnectivityManager connManager...
    99+
    2022-06-06
    示例 Android
  • Java网络编程实例——简单模拟在线聊天
    目录1、前提知识 2、实现思路: 1、前提知识 需要知道简单的IO流操作,以及简单的UDP发送数据包的原理。 需要用到的类:DatagramSocket、DatagramPacke...
    99+
    2024-04-02
  • Android编程简单获取网络上的图片
    本文实例讲述了Android编程简单获取网络上的图片的方法。分享给大家供大家参考,具体如下: 要获取网络上的图片,首先得有网络的访问权限,这个不再写了,以前的文章中写过,还有布...
    99+
    2022-06-06
    图片 Android
  • 【Linux网络】网络编程套接字 -- 基于socket实现一个简单UDP网络程序
    认识端口号网络字节序处理字节序函数 htonl、htons、ntohl、ntohs socketsocket编程接口sockaddr结构结尾实现UDP程序的socket接口使用解析so...
    99+
    2023-09-01
    网络 linux udp socket
  • [python网络编程]socket的简
    1 socket基本参数了解 1.在建立socket对象的时候,需要告诉系统两件事情1.1 通信的类型是什么(IPv4/IPv6等)1.2 使用的协议是什么?(TCP/UDP等) 2.各个通信类型和协议的标识2.1 IPv4:AF_INE...
    99+
    2023-01-31
    网络编程 python socket
  • 简析Linux网络编程函数
    目录1,创建套接字socket2,绑定套接字bind3,创建监听;listen4,等待连接accept5, 收发消息send和recv6,关闭套接字描述符close7,基于tcp协议的C/S服务器模型8,实现代码网络编程...
    99+
    2022-06-04
    Linux网络编程函数
  • Go语言网络编程:Go实现简单的内网穿透
    一、内网穿透 1. 内网穿透介绍 内网穿透是一种通过互联网建立远程连接到私有网络(内网)中设备的技术。通常情况下,内网设备由于位于一个受限制的网络环境中,无法直接从外部访问。内网穿透通过将内网设备的流...
    99+
    2023-09-02
    golang 服务器 计算机网络
  • 网络编程
    1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 网络编程...
    99+
    2023-08-30
    网络 Java
  • Android编写简单的网络爬虫
    一、网络爬虫的基本知识 网络爬虫通过遍历互联网络,把网络中的相关网页全部抓取过来,这体现了爬的概念。爬虫如何遍历网络呢,互联网可以看做是一张大图,每个页面看做其中的一个节点,页...
    99+
    2022-06-06
    爬虫 网络爬虫 Android
  • python网络编程-socket编程
    一、服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站)   C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发   二、OSI七层模型 互联网协议按照功能不同分为...
    99+
    2023-01-31
    网络编程 python socket
  • C#实现简单TCP服务器和客户端网络编程
    在C#中进行网络编程涉及许多类和命名空间,用于创建和管理网络连接、传输数据等。下面是一些主要涉及的类和命名空间: System.Net 命名空间:这个命名空间提供了大部分网络编程所需的类,包括: IPAddress:用于表示IP地址。...
    99+
    2023-10-09
    c# 开发语言
  • C#实现多线程编程的简单案例
    目录一、使用线程的理由二、基本知识三、线程的使用四、线程池五、Task类六、委托异步执行一、使用线程的理由 1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。2、可以使用线...
    99+
    2024-04-02
  • Java网络编程 - 网络编程介绍 - 网络通信三要素
    文章目录 网络编程网络编程介绍网络通信三要素要素一: IP地址IP地址基本介绍IP地址的操作类 要素二: 端口号要素三: 协议TCP协议UDP协议 网络编程 网络...
    99+
    2023-09-07
    网络 java 网络协议
  • 网络调试助手简单使用教程
    打开网络调试助手,我此处使用的版本是5.0.3,各个版本其实使用方法大同小异。 2.用该软件建立一个TCP服务器,在协议类型处选择TCP Server协议,本机IP地址一般会默认自动填入本机IP,若...
    99+
    2023-09-05
    网络 服务器 运维
  • Android网络编程
    Android网络编程目录小朋友你是不是有很多问号???一、网页源码查看器二、消息机制的写法(重点)1、相关概念2、Handler的使用3、消息...
    99+
    2022-06-06
    Android
  • 网络编程(全)
    【网络编程】 今日内容 软件架构CS/BS网络通信三要素TCP通信Socket套接字ServerSocket文件上传自定义服务器 第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client...
    99+
    2023-09-06
    网络 tcp/ip 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作