📄 subject_61593.htm
字号:
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-11-27 13:34:22
<br>内容:我发给您的那个程序的服务器的模式是不是就是“CSocket相关类的异步操作方式也算一种把。”<BR> 我又糊涂了,在那个程序中的服务器的代码编写中没有对各个客户套接字的状态测定啊?怎么实现的同步I/O?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-27 13:48:05
<br>内容:对,算是那一类的。<BR><BR>一般不需要对各个客户套接字进行状态测定。你能够收到/发送数据,说明他是好的。如果在接收发送数据的时候返回错误,那么它是坏的,断掉就行了<BR><BR>你说的同步I/O是想做到怎样的操作呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-11-27 17:19:37
<br>内容: 我对同步的理解,来源于多线程里的‘同步’定义。即某个线程现在正在sleep,该线程可以采用‘同步对象’进行监视,即同步对象状态发生改变,线程就开始同步执行。线程与同步对象实现了同步,进‘而实现多线程执行顺序的有效控制。 这是我对多线程里‘同步’定义的理解。<BR> “CSocket相关类的异步操作方式也算一种把。”<BR> 您说的这个异步,我还真不实际懂得其中的意义。<BR><BR>比如在某一时间点上,服务器同时收到了三条通信。即A给B发送了一条聊天记录。B也给A发送了一条记录。E给F发送了一条聊天记录。服务器在同一时间上同时收到这样的三条记录,怎么办?服务器是怎样把三条记录都安全发到目的地的?<BR> <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-27 17:38:06
<br>内容:同步应该是对系统逻辑而言的,对于socket操作本身没有同步这个说法。<BR>我说的CSocket的异步操作也是对于系统逻辑而言的,当一个CSocket实例调用listen之后,你的程序可以做别的事情,而不用管他,当有连接过来时,CSocket::OnAccept就会被调用。你可以认为CSocket实际上是在一个线程上运行,所以我认为它是异步的。<BR><BR>同步和异步的差别可以这样理解,比如你有3个操作,分别是do1(), do2(), do3().<BR>如果你把他们放在一个进程里:<BR>main()<BR>{<BR> do1();<BR> do2();<BR> do3();<BR>}<BR>他们的执行顺序是一定的,你可以认为这是同步的。<BR><BR>如果你把do2放到一个线程里,什么手段也不用。<BR>main()<BR>{<BR> run_thread_for_job_do2();<BR> do1();<BR> do3();<BR>}<BR><BR>void thread_proc()<BR>{<BR> do2();<BR>}<BR>那么do2()到底在do1(),do3()之前,之后还是期间,甚至执行到一半,这几种情况的那一种执行的,无法预测,这就是异步。<BR>main()<BR>{<BR> run_thread_for_job_do2();<BR> do1();<BR> set_event_1();<BR> wait_event_2();<BR> do3();<BR>}<BR><BR>void thread_proc()<BR>{<BR> wait_event1();<BR> do2();<BR> set_event2();<BR>}<BR><BR>但是如果,你增加了同步手段。<BR>那么它们的执行次序就确定为do1(), do2(), do3().这也是同步。<BR>doX()操作可以是任何操作,读写文件、读写socket,都可以。<BR><BR>总结,同步异步和socket没有关系,他是指系统逻辑上的东西;<BR>请认为CScoket是运行在一个线程上的,那么是否能够理解呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-11-28 15:15:42
<br>内容:那个聊天程序用什么手段来支持多个socket的?<BR> (不好意思,我还是决定一点一点问问题,不然,涉及面太广了)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-28 15:33:13
<br>内容:他有一个ListenSocket类,在Doc里创建一个实例,然后开始监听。<BR>在Doc里面有一个ClientSocket的列表。<BR>所有的操作都要通过Doc中转。<BR><BR>我以前说过,从CSocket继承的类都可以异步收发,就象CSocket的每一个实例都在一个线程上运行一样。当有数据到的时候,系统会自动调用CSocket的相应函数。<BR><BR>比如ListenSocket的OnAccept会在请求到达时调用。<BR>ClientSocket的OnRead会在数据到达时,调用。<BR><BR>你只要在ListenSocket和ClientSocket的几个函数设置断点,然后跟踪一下,就明白了。<BR><BR>这个程序比较简单,不过为了表示自己对微软的doc框架掌握很深,搞的程序转来转去的。<BR>记得我第一次看msdn里的那个几乎一样的sample,尽管我以前写过标准socket,但还是被这里面的CSocket和逻辑搞得晕头转向。:)<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-11-28 16:54:39
<br>内容:"你只要在ListenSocket和ClientSocket的几个函数设置断点,然后跟踪一下,就明白了."<BR> 您说的这个跟踪,是不是,比如:<BR>void CClientSocket::OnReceive(int nErrorCode)<BR>{<BR>CSocket::OnReceive(nErrorCode);//我会在这行设置断点<BR>m_pDoc->ProcessPendingRead(this);<BR>}<BR> 然后以go 进入调试程序,程序停留在断点上,然后我单击[view /debug windows/call stack]出现call stack窗口,将会把断点之前所有没有结束的函数列出来。我就想利用这个方法找到程序逻辑,即到底什么情况下,谁最终会调用到这个函数。这个方法挖掘MFC代码很好用,可是挖这个函数的‘根’就不管用。call stack窗口给我的提示是“(call stack unavailable while child is running)” ???<BR> <BR> 书上说,OnReceive 函数将被框架调用以通知套接字缓冲区有数据等待接收。 这意思,好象就是告诉我,我只需要知道,当套接字接收到数据时候,就会去调用OnReceive 函数,而做为程序员只需要去编写OnReceive 这个函数就好。至于为什么会调用到这个函数,我们不必深究!这整个逻辑都由框架控制。比如,象那个C/S聊天程序的文档类就管理着所有和服务器已连接的客户套接字。每个已连接套接字的活动都由框架(即该死的MFC框架吗?)来管理,发现哪些套接字有活动(比如 某个,或者某几个套接字来了聊天记录)框架就会去调用相应的函数去处理。这个该死的框架好象也有能力处理多客户同时向服务器发难的情况(即几十个客户机同时向服务器发送信息,而服务器可以有条不紊的处理这些信息)但,服务器这种同时处理多客户的能力对程序员是不可见的!这种能力深埋于框架中。<BR> <BR> <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-28 17:08:35
<br>内容:从你设的断点处,向下单步跟踪,就会看到程序逻辑。不用看call stack。那不是程序逻辑,而是低层实现。<BR><BR>再说一遍,要学socket,不要从CSocket着手。<BR>你不是想学“服务器这种同时处理多客户的能力”是如何实现的吗?那么就去学习标准socket先,然后再学习select, thread, eventselect等等。学完了之后,你自然就会明白CSocket的低层机制了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:小和尚 回复日期:2003-11-29 09:53:17
<br>内容:受教ing!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-12-04 10:50:24
<br>内容:师傅,我已经决定放弃这个用Csocket写的服务器程序了。不过,您有没有其他模式的源代码,比如,用多线程模式或者select模式实现的服务器。 我想先彻底研究研究他们先!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-12-04 11:01:51
<br>内容:不行啊。我手上的代码都是公司项目的一部分。而且由于要考虑特定项目相关的特性,设计上采用了许多和socket没有直接关系的包装、划分,对你来说只会添乱。<BR>按照我的理解,你先看一下标准socket,然后就是select(这个是必须要学的),当让,如果你只在windows下开发,可以考虑wsaeventselect和waitformultiobject的组合。最后才是thread。<BR>thread对于服务器来说,几乎是必需的。你可能要花大部分时间在这上面。而thread和socket通信部分可以完全分离,互不干涉的研究。<BR>继续努力,有问题可以和我讨论...
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:王英军 回复日期:2003-12-04 15:44:28
<br>内容:BigJames <BR>你好,你们的讨论我都看晕了,我是vc++的初学者,关于socket的通信以前在unix的平台上写过一个多进程的服务使用的多进程监听同一个socket(使用accept()),这样总有一个进程可以成功的受到数据,其他进程失败然后继续等待。但是使用vc++的多线程怎样实现能不能给出一个比较详细的流程,谢谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:可爱 回复日期:2003-12-05 16:53:59
<br>内容:BigJames<BR>你可以教我吗?我也是学习网络的,但是往往被那些带有很多参数的函数和长长的代码搞得晕头转向!你可以读懂程序的每行代码吗?你是怎么一步步学习网络编程的啊?<BR>我相信网络高手真的很多,但像你这样不厌其烦的教别人的高手真的很少!!!佩服ing
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:可爱 回复日期:2003-12-06 09:57:07
<br>内容:期待答复!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -