一、填空题(共24分)(1)面向对象编程的特征3‘封装性、继承性、多态性(2)VC(两大方向、两大工具)工具一【应用程序向导(AppWizard):可以生成应用程序骨架文件(代码和资源等)】;工具二【类向导(ClassWizard):将代码添加到骨架文件】;方向一【基于WindowsAPI的C编程方式,特点:代码效率高,但开发难度和工作量也很高】;方向二【基于MFC的C++编程方式,代码运行效率相对较低,但开发难度小,开发工作量小,源代码效率高。(主流)】。(3)套接字(地址的绑定、类型、初始化、创建)类型:流式套接字(SOCK_STREAM);数据报式套接字(SOCK_DGRAM);原始套接字(SOCK_RAW)以创建TCP服务客户端为例:创建套接字:利用socket()函数创建一个套接字,同时定义一个SOCKETsockClient描述符,用来接收socket()函数的返回值【SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);】(服务端改成sockSrv)初始化:定义一个SOCKADDR_IN类型的结构体变量,并进行初始化SOCKADDR_INaddrCli;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrCli.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);addrCli.sin_family=AF_INET;addrCli.sin_port=htons(6000);(创建服务端改成addrSrv,没有第三行)绑定:创建客户端不需要套接字绑定;创建服务端利用bind()函数将该服务器和套接字绑定【bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));】(4)WinsockI/O工作模式阻塞模式、非阻塞模式(5)常用头文件和动态库文件#includeWinsock2.h#includestdio.hWs2_32.lib(6)控件(编辑框、命令按钮、单选框、复选框、静态文本、组框、IP地址控件)、类、连接变量、消息、常用处理函数(7)API函数(8)UDP和TCP数据发送和数据接收函数TCP:recv()、send()UDP:sendto()、recvfrom()二、单项选择题(共30分)(1)MFC类的特点、继承图表、根基类、常用类(2)UDP服务中用到的函数WSAStartup()函数加载套接字库和版本协商;socket()函数创建一个套接字;bind()函数将该服务器和套接字绑定。connect()函数连接服务器,不需要与套接字绑定。sendto()函数发送数据到服务端,recvfrom()接收数据。closesocket(sockClient)来关闭套接字和WSACleanup()结束套接字库的使用(3)TCP服务中用到的函数(加上UDP下划线的)listen()函数设置服务器的监听状态。accept()函数接受客户端请求,send()函数发送数据到客户端,利用recv()函数接收客户端数据。(4)套接字的初始化和终止利用closesocket()来关闭套接字(5)控件和类的关联三、简答题(共16分)(1)套接字概念、套接字编程特点网络编程接口;1套接字存在于通信域中,套接字通常只和同一域中的套接字交换数据;如需越域界,就要执行某种解释程序;2套接字有3种类型,套接字都有它确定的类型,只有相同类型套接字才能相互通信;3每一个套接字都有一个相关的应用层的通信进程;操作该套接字的代码是该进程的组成部分;4绑定确定的IP地址和传输层端口号。(2)网间进程通信必须解决的问题1网间进程的标识问题;2与网络协议栈连接的问题;3多重协议的识别问题;4不同的通信服务的问题。(3)控件ID和控件连接变量之间的区别(4)UpdateData()函数的作用获得用户的当前输入(服务器名,用户名和口令)(5)MFC、MFC编程的特点MFC是一个编程框架,由MFC中的各种类结合起来构成的。1MFC类库是C++类库,分别封装了Win32应用程序编程接口、应用程序的概念、OLE特性、以及ODBC和DAO数据访问的功能;2MFC将众多类的共同特性抽象出来,设计出一些基类,作为实现其他类的基础。3以C++为基础,支持虚拟函数和动态约束。4MFC实现了对应用程序概念的封装,实现了类、类的继承、动态约束、类的关系和相互作用的封装。(6)C/S模式面向连接编程流程基于TCP协议的编写步骤服务器端1.创建流式监听socket2.获得本地IP地址,主机名和端口号,并用来填充socket3.调用bind函数绑定本地端口号4.调用listen开始进行监听5.调用accept建立连接,得到新的套接字6.进行循环利用recv,send在新的套接字上读写数据,直到完成交换7.关闭套接字客户端1.建立流式套接字socket2.利用connect与server端连接3.利用send和recv向server进行数据交换4.关闭套接字(7)C/S模式非连接编程流程基于UDP协议的编写步骤服务器端1.创建数据报式socket2.获得本地IP地址,主机名和端口号,并用来填充socket3.调用bind函数绑定本地端口号4.建立循环,利用recrfrom从套接字读写数据,直到交换完成5.关闭套接字客户端1.创建数据报式socket2.调用bind函数绑定本地端口号3.利用sendto和recvfrom向server进行数据交换4.关闭套接字(8)常用程序功能分析。四、综合题(共30分)一、VC界面程序设计(四则运算、计算器)步骤:四则运算(1)创建MFCAppWizard工程文件,选择基于对话框应用程序;(2)界面设计:在对话框界面放置如上图所示控件,将左右两编辑框分别连接一个double类型的变量m_e1和m_e2,结果编辑框连接一个double类型的变量m_e。(3)初始化:单选按钮的初始化工作在对话框的初始化函数实现,//TODO:Addextrainitializationhere;注意在提示信息的后面添加:CheckRadioButton(IDC_RADIO1,IDC_RADIO4,IDC_RADIO1);(4)计算按钮消息响应设置:voidCMyDlg::OnButton1(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);if(IsDlgButtonChecked(IDC_RADIO1))m_e=m_e1+m_e2;elseif(IsDlgButtonChecked(IDC_RADIO2))m_e=m_e1-m_e2;elseif(IsDlgButtonChecked(IDC_RADIO3))m_e=m_e1*m_e2;elsem_e=m_e1/m_e2;UpdateData(FALSE);}步骤:计算器1、拖动对话框调整窗口大小,并放置如图要求的控件2、设置按钮的属性(改标题)3、设置控件属性设置:(1)ID:IDC_EDIT(2)本排列为Right,选择Read-Only(3)连接添加变量m_e(Value,CString)4、为类C***Dlg添加成员变量:(1)public:charComputype;//用于存储运算符(2)protected:CStringFirstInput;//用于存储左操作数5、为按钮单击响应添加函数代码(1)数字的函数代码分别为:m_e=m_e+1;//该示例为1按钮代码,其他数字按钮将字符串1分别改为0、2、3、……9;UpdateData(FALSE);(2)+-*/按钮:FirstInput=m_e;m_e=;UpdateData(FALSE);CompuType='+';//该示例为+按钮代码,其他按钮将字符+改为-、*、/;(3)Clear按钮:m_e.Empty();UpdateData(FALSE);(4)About按钮:CAboutDlgdlgAbout;dlgAbout.DoModal();(5)Close按钮:OnOK();(6)=按钮:intTemp;intFirst,New;First=atoi(FirstInput.GetBuffer(24));//atoi()将字符串类型转换为整型FirstInput.ReleaseBuffer(-1);New=atoi(m_e.GetBuffer(24));m_e.ReleaseBuffer(-1);switch(CompuType){case'+':Temp=First+New;break;case'-':Temp=First-New;break;case'*':Temp=First*New;break;case'/':Temp=First/New;break;}sprintf(m_e.GetBuffer(24),%d,Temp);m_e.ReleaseBuffer(-1);UpdateData(FALSE);二、简单编程题目例:已知Internet通信域的地址结构变量sockaddr_in(也可以写成SOCKADDR_IN)的定义如下,现在定义一个结构体变量SOCKADDR_INaddrSrv;请初始化地址变量addrSrv,要求:IP地址INADDR_ANY,端口号3000,协议采用TCP/IP,IP地址和端口号要使用网络字节顺序。(1)structsockaddr_in{shortsin_family;unsignedshortsin_port;structin_addrsin_addr;charsin_zero[8];};(2)structin_addr{union{struct{u_chars_b1,s_b2,s_b3,s_b4;}S_un_b;struct{u_shorts_w1,s_w2;}S_un_w;u_longS_addr;}S_un;};AddrSrv.sin_family=AF_INET;AddrSrv.sin_port;=htons(3000)AddrSrv.sin_addr.S_un.S_addr=htonl(172.16.54.18)三、函数的应用(函数参数的解释、函数的正确调用,类似函数的简单功能比较)