第8章 MFC套接字编程
- 格式:ppt
- 大小:731.50 KB
- 文档页数:32


C语言网络编程套接字和常用协议网络编程是现代计算机科学中非常重要的一个领域,通过网络编程可以实现不同设备之间的数据传输与通信。
C语言作为一种强大的编程语言,在网络编程方面也有着广泛的应用。
本文将介绍C语言网络编程中常用的套接字和协议。
一、套接字(Socket)基础概念套接字是计算机网络中进行网络通信的一种方式,可以看做是网络中两个应用程序之间的一个端点。
套接字使用IP地址和端口号来唯一标识一个通信节点。
在C语言中,套接字相关的操作需要通过系统调用函数来实现。
1. 创建套接字在C语言中,创建套接字需要使用socket()函数,该函数返回一个套接字描述符,可以用于后续的通信操作。
常见的套接字类型包括流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)等。
2. 绑定套接字绑定套接字可以将套接字地址和具体的IP地址以及端口号关联起来,从而能够监听特定的网络地址。
在C语言中,可以使用bind()函数来绑定套接字。
3. 监听连接如果希望接受其他应用程序的连接请求,可以使用listen()函数来监听特定的套接字。
4. 接受连接一旦有连接请求到达监听套接字,可以使用accept()函数来接受连接请求,返回一个新的套接字描述符,用于与客户端进行通信。
5. 发起连接如果希望主动向其他应用程序发起连接请求,可以使用connect()函数来建立连接。
6. 数据传输已建立连接的套接字可以通过read()和write()等函数进行数据的读取和写入操作,实现数据的传输。
二、网络协议在网络编程中,协议起到了关键的作用,它定义了数据的传输方式、格式和规则,确保网络通信的可靠性和正确性。
下面是常用的网络协议:1. TCP/IP协议TCP/IP协议是互联网上最常用的协议之一,它基于TCP传输协议和IP网络协议。
TCP协议提供了一种可靠的数据传输方式,确保数据的有序、完整、无差错地传输;而IP协议则负责数据在网络中的传输。
基于MFC的socket编程⽹络编程1、windows 套接字编程(开放的⽹络编程接⼝)添加头⽂件#include<windows.h>2、套接字及其分类socket分为两种:(1)数据报socket:⽆连接套接字,可向指定的socket发送数据报消息,也可从指定的socket接收消息,提供双向的⾯向记录的数据流。
但不能保证数据传输的顺序,也不能保证传输的可靠性。
(2)数据流socket:(例如电话呼叫),基于显式连接的套接字,通过没有记录的双向字节数据流,具有可靠的发送顺序,接收也是可靠的,适合处理⼤量数据的传输。
3、客户端/服务器模型(C/S模型)⽹络编程常⽤的⼀种架构模型,将应⽤程序分为:(1)前端客户端组件:运⾏在⼯作站上,负责从⽤户接收数据,为服务器处理数据,并形成到服务器的连接。
(2)后台服务器组件:等待客户端的连接,当服务器收到客户端的连接请求后,服务器会处理并返回客户端响应信息,客户端收到响应信息后,通过⽤户接⼝,呈现给⽤户.⽬前很多项⽬都设计为分布式程序,以提⾼应⽤程序的性能。
设计的关键是程序的性能和可扩展性。
4、⽹络字节顺序标准的⽹络字节序是采⽤⼤端模式,⽽Intel采⽤⼩端模式。
若使⽤MFC 的socket编程,即服务器和客户端都使⽤MFC,则⽆需关⼼字节顺序。
5、使⽤WinSock API 进⾏编程6、MFC对WinSock API 进⾏了封装。
提供了两个类:(1)类CAsynSocket⼀对⼀地封装了WinSock API。
(2)类CSocket提供以CArchive对象中序列化数据的Socket功能。
使⽤CSocket类,必须创建CSocket对象,使⽤对象底层的Socket句柄。
对客户端使⽤默认参数调⽤create()⽅法就好,对服务器socket对象,必须在create()⽅法中指定IP地址和端⼝。
下⾯是使⽤MFC socket编程的⼀个简单例⼦服务器端程序:(1)创建服务器(2)连接请求连接的客户端(3)与客户端进⾏数据传输(发送和接收)(4)客户端断开服务器界⾯如下图所⽰:部分代码:/*说明:本函数⽤于打开或关闭服务器,主要⽤到Create函数和Listen函数⽤于创建服务器和监听客户端。
MFCsocket⽹络编程(流程⽰例)MFC socket⽹络编程(流程⽰例)1.TCP流式套接字的编程步骤在使⽤之前须链接库函数:⼯程->设置->Link->输⼊ws2_32.lib,OK!服务器端程序:1、加载套接字库2、创建套接字(socket)。
3、将套接字绑定到⼀个本地地址和端⼝上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回⼀个新的对应于此次连接的套接字(accept)。
6、⽤返回的套接字和客户端进⾏通信(send/recv)。
7、返回,等待另⼀客户请求。
8、关闭套接字。
客户端程序:1、加载套接字库2、创建套接字(socket)。
3、向服务器发出连接请求(connect)。
4、和服务器端进⾏通信(send/recv)。
5、关闭套接字。
服务器端代码如下:#include <Winsock2.h>//加裁头⽂件#include <stdio.h>//加载标准输⼊输出头⽂件void main(){WORD wVersionRequested;//版本号WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) { return; }//加载套接字库,加裁失败则返回if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ){WSACleanup( );return;}//如果不是1.1的则退出SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。
以下是一个使用MFC套接字编程的简单示例,其中包括一个客户端和一个服务器端。
服务器端代码:// MyServerDlg.h#pragma once#include "afxsock.h"class CMyServerDlg : public CDialog{// ...CAsyncSocket m_serverSocket;CAsyncSocket m_clientSocket;// ...}// MyServerDlg.cppvoid CMyServerDlg::OnAccept(){m_serverSocket.Accept(m_clientSocket);}void CMyServerDlg::OnReceive(){char buffer[1024];int bytesRead = m_clientSocket.Receive(buffer, sizeof(buffer));// 处理接收到的数据}void CMyServerDlg::OnSend(){char buffer[1024];// 填充要发送的数据到buffer中m_clientSocket.Send(buffer, sizeof(buffer));}客户端代码:// MyClientDlg.h#pragma once#include "afxsock.h"class CMyClientDlg : public CDialog{// ...CAsyncSocket m_clientSocket;// ...}// MyClientDlg.cppvoid CMyClientDlg::OnConnect(){m_clientSocket.Connect(_T("127.0.0.1"), 1234);}void CMyClientDlg::OnReceive(){char buffer[1024];int bytesRead = m_clientSocket.Receive(buffer, sizeof(buffer));// 处理接收到的数据}void CMyClientDlg::OnSend(){char buffer[1024];// 填充要发送的数据到buffer中m_clientSocket.Send(buffer, sizeof(buffer));}这是一个简单的MFC套接字编程示例,服务器端和客户端通过套接字进行通信。