利用MFC的Csocket类实现网络通信
- 格式:ppt
- 大小:351.50 KB
- 文档页数:22
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)。
今天晚上11点半,在学校断网后的十分钟,我终于实现了C++服务器端与Android客户端的通信。
本来很简单的一件事,却因为Android Socket线程阻塞的问题弄了我两天。
好了不多说,直接进入主题:C++ 服务器端:用C++进行网络编程有很多方式,比如可以使用winSock,winInt,或者使用MFC的封装类CSocket等等。
这里我使用的是比较简单的CSocket类来实现。
这里先简单说说使用CSocket类来建立服务器端的过程:上图是C++服务器端与Android客户端通信的流程图。
看到上面的流程图,C++程序员应该感到高兴,这不就是CSocket客户端的变体嘛。
服务器端完全没变化,这先不说,Android客户端连connet动作都省下来了。
这……是不是写错了?没错,确实连connet这个步骤都省了。
当然,没有connect只不过是因为这个connect 的动作直接被封装到了Android Socket的new操作里而已。
不然,服务器端怎么可能知道你这个狡猾的客户端会不会三更半夜的来敲门,说要提供服务啊。
哈哈。
注:在Android Socket的构造函数中有多种形式,并不是每一种形式都必须在构造时就连接到服务器。
读者可以自己阅读Android的开发文档,你会发现Socket也有个名为Connect的成员函数。
好了,有了基本的操作流程后,写起代码来就容易多了。
观察流程图中C++服务器端的构造过程可以知道,服务器端的构造大致分为三大步骤:1、创建用于侦听的socket套接字sevSock并开启侦听;2、创建用于接收/发送信息的socket套接字reveiceSoc,创建后“绑定”到侦听套接字;3、reveiceSoc套接字接收/发送信息。
这几个步骤对于C++程序员来说已经是滚瓜烂熟了。
我也不多说,直接动手更见效。
(开发环境:VS 2008)第一步:创建一个新MFC应用程序项目,这里名为AndroidSocket,应用程序类型为“基于对话框”就可以了。
使用CSocket类的网络通信实例本例采用CSocket编程模型建立一个聊天程序的简单实例。
使用vc++6建立一个基于对话框的工程,建立工程时注意选上“Windows套接字”复选框。
一、服务器端应用程序设计(工程名称SocSvr)1.1、界面及各控件属性界面如下:控件类型控件ID Caption属性控件变量变量类型列表框IDC_LST_Log m_lst_log CListBox 编辑框IDC_EDT_SenMsg m_edt_senMsg CEdit按钮IDC_BTN_Send m_btn_send CButton列表框控件IDC_LST _Log的属性“sort”值为false,属性“Horizontal Scroll”值为true。
按钮IDC_BTN_Send属性Disable值为true。
1.2、定义CSocket类的派生类CSocListen和CSocRecv从CSocket编程模型知道,服务器端需要两种套接字,一个用来侦听连接请求,一个用来与请求连接的套接字建立连接。
因此,为程序添加两个CSocket派生类:SSocListen和CSocRecv,它们与对话框类密切配合,共同完成程序所要求实现的功能。
在vc集成环境左侧的工程管理栏中,切换到“class view”页,对准“SocSvr Classes”点右键,在弹出的菜单中点击“new class”,弹出“new class”对话框。
在此对话框的“Class type”组合框中选择“MFC Class”,在“Base class”组合框中选择“CSocket”,然后再在“Name”文本框中填入类的名称“CSocListen”,点击“OK”按钮。
这样,一个CSocket类的派生类“CSocListen”就创建好了。
用同样的方法创建CSocket类的另一个派生类“CSocRecv”。
创建过程的对话框如下图所示。
1.3、建立套接字与对话框类的关联在程序中,对话框类要用到套接字类,而套接字类在响应某些消息,如在函数OnAccept、OnReceive中进行处理时,也要改变对话框的某些控件状态,以反映给用户这些事情的发生。
一. 设计原理计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。
各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、中国移动的Fetion等,都是做的比较成功的实时聊天工具。
随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。
接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。
此程序主要分为两个模块:服务线程和聊天线程。
服务线程用于提供一个网络端口,等待客户线程发出请求,登录到作为服务端的程序,然后进行网络通讯和消息的收发;客户端可通过服务器端的IP 地址发送连接请求,然后建立连接,进行通讯。
整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。
二.功能描述(需求分析)1、一对一会话。
此程序既可以作为服务器,也可以作为客户端。
当发起聊天请求时是客户端,而当接受连接请求时时服务器。
通讯基于可靠的TCP连接。
2、修改联系人通讯地址。
可以根据联系人IP地址和端口的不同建立不同的连接。
可以实时修改联系人的地址。
3、多线程技术。
进程启动时会开启一个专门用于监听连接请求的服务进程,线程函数为UINT threadListen(LPVOID lpParam),用来被动接受聊天请求。
无论是主动发起聊天请求还是被动接受连接请求,都将启动一个名为CIMTalking的线程,专门处理聊天业务。
4、整个程序的主体使用了基于CSocket类的网络编程方法,综合运用了CSocket、CSocketFile、CArchive等类的方法,实现了网络通讯聊天。
IM的功能可划分为以下几点:1)界面显示:将在线好友显示在好友列表中,并实现好友分组,便于选择联系人。
2)聊天功能:与好友聊天。
mfc程序实验报告篇一:MFC实验报告实验日期:2013 年05 月18 日一、实验目的1、熟悉Visual C++的基本操作。
2、基本了解基于对话框的windows 应用程序的编写过程。
3、对于Windows Socket编程建立初步概念。
二、实验要求1、应用Visual C++中MFC CSocket 类,实现网络数据传输。
2、仿照本实验步骤,制作实用的局域网一对一聊天程序。
三、实验原理设置加入连接的数目,通过更改IP 地址和端口号,成为不同的客户端,与服务器端连接,实现用户间的聊天功能。
1.程序整体框架:主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。
当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。
2.客户端(Client)客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个端口。
3.服务器端(Server)服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
4.用户图形界面用户图形界面方便程序与用户的交互,多个用户参加,完成会话功能,具体的设计要方便用户的使用,直观清晰,简洁明了,友好美观。
四、实验内容一个最简单的点对点聊天程序客户机/服务器模式是socket点对点网络程序典型的模式,以下这个实验就是实现一个简单的点对点通信的聊天程序。
它用到的方法也是面向连接TCP连接的套接字MFC典型方式。
其工作过程是:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行信息通信。
vc++网络聊天室的实现计算机操作系统课程设计说明书(含MFC源程序)————————————————————————————————作者:————————————————————————————————日期:实验报告||实验名称网络聊天室的实现课程名称计算机操作系统||目录【1】设计原理—-—————————-———--——-—-—4 【2】程序流程图———-——————-—-———————-—9 【3】设计步骤—-—-—-———————————————-—10 【4】使用方法说明———--————-——-———————-21 【5】实验结果及分析—-——-—————--————-———24设计原理计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。
各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion 等,都是做的比较成功的实时聊天工具。
随着网络的日益普及,各种聊天工具也层出不穷,接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。
此程序主要分为两部分:服务器端和客户端。
服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。
在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。
服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。
整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。
整个程序设计为两个部分:服务器(ChatServer)和客户端(Chat)多人聊天的关键在于要将每个客户端发送过来的消息分发给所有其他客户端,为了解决这个问题,在服务器程序中建立一个套接口链表,用来保存所有与客户端建立了连接的服务端口.下面描述了多人聊天的实现原理:当客户端Client N向对应的服务端口N发送了消息Message,服务端口N将Message 复制给所有套接口列表(USERLIST)中的套接口缓冲区,然后向每个服务端口发送WRITE 消息,使每个服务端口将Message发送给对应的客户端。
c++/MFC CSocket仿QQ聊天软件,实现1对1聊天,群聊分类:c++ 2012-11-25 16:45 1582人阅读评论(13) 收藏举报c++C++mfcMFCqqQQsocket聊天学习,c++有2个星期了。
本来,本人是做php出身的。
做php快2年了,最近身边多了很多高手。
让自己对c开始感兴趣了,就开始学习c++了。
首先接触的就是mfc。
前几天,看到了一个博文,是有关,mfc网络编程的。
可对方,的实例只能是多对多,出于兴趣,自己改写了下它的程序,实现了点对点的聊天。
所以,本实例并非纯原创的。
这个还请大家见谅,尤其是作者。
我在他程序基础上,增加了1对1的聊天,同时还保留了群聊。
而且,最关键的是,我增加了很多备注。
很适合新手学习。
本人也是新手,还请各位高手提出宝贵建议。
先谢谢大家了。
如果要转载请注明原地址:/open520yin/article/details/8222279实例下载地址:/detail/open520yin/4808903(为了自己能有点下载积分,客户端和服务端一起打包5个积分不算贵吧。
呵呵。
)大家要是想看懂这个可能还需要先了解一下mfc的socket的一些基本使用规则我也有一篇博文写了c++/MFC 极为简单的socket实例:/open520yin/article/details/8202465MFC的CSocket编程,利用CSocket实现一个基于TCP实现一个QQ聊天程序。
///////////////////////////////////////////////////////////////////////// 服务端start ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////先讲讲服务端,一切先从服务端开始:首先就是要使用AfxSocketInit初始化winsocket,[cpp]view plaincopyprint?1. //初始化winSock库,成功则返回非0否则返回02. WSAData wsData;3. if(!AfxSocketInit(&wsData))4. {5. AfxMessageBox(_T("Socket 库初始化出错!"));6. return false;7. }m_iSocket 是一个CServerSocket*的指针 ,CServerSocket类是一个我们自己的类我会在后面给出相应代码,他继承于CSocket类。