在vs2008下载做一个MFC的socket的TCP的聊天工具(C++)、不是控制台的哦、、求大神帮助,最好有图有真相

C++ socket 写一个控制台下的网络通讯,可以进行对话及数据传输,怎么做?_百度知道&&&&一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能)
一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能)
环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK
使用步骤:
1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。
2、首先运行服务器端工程,选默认的端口1008
3、然后运行客户端工程,选默认的端口1008和默认的服务器地址
4、再运行多个客户端进程
5、如果一切正常,可以每个客户端的消息发送,我们可以在服务端和各个客户端同步看到消息
实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket类实现了C++的网络通讯编程功能。
本示例注释非常详细,所有的辅助类都放一个util目录中,然后在工程中分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。
参看的思路:在服务端要从回调方法onAccept读起;而客户端代码主要从OnSendButton方法读起,即可理解整个代码的意思。
阅读对象:具有Java的Socket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员
若举报审核通过,可奖励20下载分
被举报人:
arkliszeng
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行用vs2008编MFC,找不到message maps选项卡~菜鸟求助!! - 开源中国社区
当前访客身份:游客 [
当前位置:
各位大侠,我用VS2008编MFC,然后照着书上的学习,发现VS2008没有message maps这个选项卡~
虽然找到了add class这项,但是发现只能添加,功能不如message maps强大啊~~~~
求助,VS2008里有类似message maps这样的功能没?
小女子先行谢过!!!!!
共有1个答案
<span class="a_vote_num" id="a_vote_num_
自己添加消息给控件,vs2008没有。你看的书 编译器估计是vc6.0,& 想按照书上来,就到网上下载vc6.0& 很多的,也就300M左右、、、
--- 共有 2 条评论 ---
: 道理都一样
只是简单与不简单的区别
(3年前)&nbsp&
呃,之前是VC6.0。但是不是VS2008更商用么,所以就下来学习了。
(3年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
Shining...的其它问题
类似的话题13517人阅读
MFC/C#/Qt(15)
TCP/IP/UDP等网络编程(3)
要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。&对于网络编程,我们也言必称TCP/IP,&#20284;乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证数据的正确和可靠性,后者则允许数据丢失。最后,我们还知道,在建立连接前,必须知道对方的IP地址和端口号。除此,普通的程序员就不会知道太多了,很多时候这些知识已经够用了。最多,写服务程序的时候,会使用多线程来处理并发访问。&我们还知道如下几个事实:<span style="font-size:18 color:#。一个指定的端口号不能被多个程序共用。比如,如果IIS占用了80端口,那么Apache就不能也用80端口了。<span style="font-size:18 color:#。很多防火墙只允许特定目标端口的数据包通过。<span style="font-size:18 color:#。服务程序在listen某个端口并accept某个连接请求后,会生成一个新的socket来对该请求进行处理。&于是,一个困惑了我很久的问题就产生了。如果一个socket创建后并与80端口绑定后,是否就意味着该socket占用了80端口呢?如果是这样的,那么当其accept一个请求后,生成的新的socket到底使用的是什么端口呢(我一直以为系统会默认给其分配一个空闲的端口号)?如果是一个空闲的端口,那一定不是80端口了,于是以后的TCP数据包的目标端口就不是80了--防火墙一定会组织其通过的!实际上,我们可以看到,防火墙并没有阻止这样的连接,而且这是最常见的连接请求和处理方式。我的不解就是,为什么防火墙没有阻止这样的连接?它是如何判定那条连接是因为connet80端口而生成的?是不是TCP数据包里有什么特别的标志?或者防火墙记住了什么东西?
&后来,我又仔细研读了TCP/IP的协议栈的原理,对很多概念有了更深刻的认识。比如,在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。而IP层主要负责的是在节点之间(End to End)的数据包传送,这里的节点是一台网络设备,比如计算机。因为IP层只负责把数据送到节点,而不能区分上面的不同应用,所以TCP和UDP协议在其基础上加入了端口的信息,端口于是标识的是一个节点上的一个应用。除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传送。不管应用层看到的是怎样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。&所以,我有理由怀疑,防火墙并没有足够的信息判断TCP数据包的更多信息,除了IP地址和端口号。而且,我们也看到,所谓的端口,是为了区分不同的应用的,以在不同的IP包来到的时候能够正确转发。&TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket编程接口--原来是这么回事啊!&在Socket编程接口里,设计者提出了一个很重要的概念,那就是socket。这个socket跟文件句柄很相&#20284;,实际上在BSD系统里就是跟文件句柄一样存放在一样的进程句柄表里。这个socket其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定的对象进行操作--这其实是C语言的问题,在C&#43;&#43;语言里,这个句柄其实就是this指针,实际就是对象指针啦。&现在我们知道,socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。&现在我们明白,如果一个程序创建了一个socket,并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是Socket编程接口,所以首先由Socket层来处理)。所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!而同时,放火墙的对IP包的处理规则也是清晰明了,不存在前面设想的种种复杂的情形。&明白socket只是对TCP/IP协议栈操作的抽象,而不是简单的映射关系,这很重要!&<span style="font-size:18 color:#、TCP连接手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。&建立起一个TCP连接需要经过“三次握手”:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j&#43;1),同时自己也发送一个SYN包(syn=k),即SYN&#43;ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k&#43;1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。注:ACK为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段连接的第一个包,非常小的一种。SYN 攻击包括大量此类的包,由于这些包看上去来自实际不存在的站点,因此无法有效进行处理。
&断开经历的”四次握手“当一方断开断开连接时,会向对方发送一个FIN包;对方在收到FIN包后,会发送一个ACK确认包,因此,通常来说双向连接需要从每个TCP端点发送一对FIN和ACK即四次握手
2、HTTP连接&HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。&HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。&<span style="font-size:18 color:#)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。<span style="font-size:18 color:#)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。&
3、SOCKET原理<span style="font-size:18 color:#.1套接字(socket)概念套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。&应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务转自:/riacool/archive//1905404.html
void CADlg::OnButton1()
CSocket jin,
jin.Create(6666);
jin.Listen(5);
jin.Accept(she);
void CADlg::OnButton1()
jin.Create();
jin.Connect(&127.0.0.1&,6666);
jin.Accept(she); 处于阻塞状态;而客户端jin.Connect(&125.74.66.77&,6666);唤醒服务端的阻塞
2、#define&SERVER_MESSAGE&WM_USER&#43;100&&//服务器端消息代号
#define&CLIENT_MESSAGE&WM_USER&#43;101&&//客户端消息代号
3、afx_msg LRESULT OnServerMessage(WPARAM wParam,LPARAM lParam)和ON_MESSAGE(SER_MESSAGE,OnServerMessage):ON_MESSAGE(SER_MESSAGE,OnServerMessage) 这只是填写消息影射表的时候,用到的一个宏,也就是使SER_MESSAGE消息,和OnServerMessage函数相关联。是你触发了这个SER_MESSAGE消息,然后调用OnServerMessage(WPARAM wParam,LPARAM lParam) 处理函数。
4、sock_addr.sin_addr.S_un.S_addr=inet_addr(IpAddressTemp.GetBuffer(0)); //如果在自己电脑上通信,ip必须为本机的:inet_addr(&192.168.1.106&);或者:设置成本地机器的回路127.0.0.1
5、typedef CList&SOCKET,SOCKET&& SOCKET_ARRAY;解释:
在C&#43;&#43;中,上述类型定义中CList是一个模板类型名,该模板类型需要两个占位符:SOCKET和SOCKET&,做为实例化该类的对象时使用。比如:声明一个模板类对象的语句为CList&Socket,Socket&& ob_其中Socket为已经定义好了的类型名,对象ob_client实例化以后,类CList中所有定义为SOCKET和SOCKET&的地方将分别被Socket和Socket&所代替。
如下图所示:TP-Linker 中输入192.168.1.1,转发规则-&虚拟服务器,如果你需要在不同的无线网络中都能使用你自己的TCP/IP编程,那么你需要将你的端口号和路由器分给你的IP号绑定起来,那么其他用户都可以通过这个端口号和IP地址和你进行通信了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:281653次
积分:2411
积分:2411
排名:第11261名
转载:101篇
评论:29条
(1)(2)(2)(3)(1)(2)(4)(4)(9)(6)(2)(2)(2)(11)(1)(5)(4)(6)(2)(2)(7)(2)(6)(15)}

我要回帖

更多关于 vs2008下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信