📄 subject_32725.htm
字号:
<p>
序号:32725 发表者:柯阳 发表日期:2003-03-14 10:53:10
<br>主题:如何用TCP协议实现同时一对多的连接?急
<br>内容:各位大哥,小弟最近在试着用TCP协议进行网络传输。遇到难题了:如何用WSAAsyncSelect模型实现服务端同时应付多个客户端的连接?一对一我做出来了。<BR>代码如下:<BR>服务端:<BR>1。初始化<BR>2。listen(s_sockfd,5)<BR>3。WSAAsyncSelect(s_sockfd,hhwnd,WM_SOCKET,FD_ACCEPT)<BR>4。处理方法:<BR>SOCKET sAccept;(接受)<BR> HWND hhwnd;<BR> hhwnd=GetSafeHwnd();<BR> switch(WSAGETSELECTEVENT(lParam))<BR> {<BR> case FD_ACCEPT:<BR> if(WSAGETSELECTERROR(lParam))<BR> {<BR> closesocket((SOCKET)wParam);<BR> break;<BR> }<BR><BR> sAccept = accept(wParam,(SOCKADDR *)&acc_sin,&namelen);<BR> WSAAsyncSelect(sAccept,hhwnd,WM_SOCKET,FD_WRITE|FD_CLOSE);<BR> <BR> break;<BR><BR> case FD_READ:<BR> //从wParam中的套接字中检索数据<BR> break;<BR><BR> case FD_WRITE:<BR> //从wParam中的套接字已准备好发送数据<BR> break;<BR> default:<BR> MessageBox("default");<BR> break;<BR> }<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:柯阳 回复日期:2003-03-14 10:58:44
<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-03-14 12:42:08
<br>内容:一对多?<BR><BR>不太明白这是什么意思?<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>
回复者:柯阳 回复日期:2003-03-14 13:02:27
<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-03-14 13:05:15
<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>
回复者:iwill 回复日期:2003-03-14 13:07:13
<br>内容:accept之后将新产生的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-03-14 13:24:29
<br>内容:iwill 兄能否说具体一点阿,如果保存到链表,那么在传输数据的时候该怎么用呢,因为有那么多sockes。如send(sAccept,(char *)&dataSHandSZ[5],sizeof(DATA),0);这里用sAccept。能否给一点提示的代码呢?
<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-03-14 13:26:17
<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>
回复者:柯阳 回复日期:2003-03-14 13:40:53
<br>内容:就是阿<BR>我的例子就是这样阿,但是“服务器产生一个新的套结字与客户端建立连接”连接完了就没有新的套接字可用了。我是说用WSAAsyncSelect这种模型阿。<BR>如:<BR>case FD_READ:<BR> //从wParam中的套接字中检索数据<BR> recv(sAccept,temp,5,0);<BR> break;<BR><BR>case FD_WRITE:<BR> //从wParam中的套接字已准备好发送数据<BR> send(sAccept,(char *)&dataSHandSZ[5],sizeof(DATA),0);<BR> break;<BR>这边的sAccept就是新建的套接字阿。但是如果同时连接很多客户端怎么办阿。可否提供点代码。<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-03-14 13:47:50
<br>内容:保存在这里的:<BR>sAccept = accept(wParam,(SOCKADDR *)&acc_sin,&namelen);<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>
回复者:柯阳 回复日期:2003-03-14 13:51:51
<br>内容:老鸭兄你可能误会我的意思了。我知道sAccept = accept(wParam,(SOCKADDR *)&acc_sin,&namelen);<BR>这个就是服务器端新创建的。<BR>但是它在传送数据的时候只能跟一个客户端保持实时连接阿。因为我这个模型是要一个服务端同时对好几个客户端,而且是每时每刻都在传数据,一般一天要5个小时左右!!!<BR>现在只有一个sAccept ,所以send()和recv()只能发给一个客户端阿
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:唐老鸭 回复日期:2003-03-14 14:25:28
<br>内容:不太了解你的用意!<BR><BR>我这没VC,WSAAsyncSelect是什么函数》?<BR><BR>循环接收新的套结字,把每次接收的套结字保存起来(不是临时变量中),即可以把sAccept 存到一个全局的数组或连表中!<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-03-14 14:53:54
<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-03-15 13:39:30
<br>内容:下载一个我的PPQ.DLL吧,他利用对象来实现传递
<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-03-15 17:33:09
<br>内容:请问你的ppq。dll在哪里可以下载来看阿?
<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-03-17 15:59:36
<br>内容:CObList *m_pSockList = new CObList;<BR>每次accept 后<BR>sAccept = accept(wParam,(SOCKADDR *)&acc_sin,&namelen);<BR>m_pSockList->AddTail((CObject*)&sAccept);<BR>发送时:<BR>case FD_WRITE:<BR><BR>POSITION pos = m_pSockList->GetHeadPosition();<BR>while(pos != NULL)<BR>{<BR>SOCKET sock = (SOCKET)m_pSockList->GetNext(pos);<BR> send(sock,temp,5,0);<BR>}<BR> break;<BR><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>
回复者:柯阳 回复日期:2003-03-18 09:17:15
<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>
回复者:DarkCoder 回复日期:2003-03-18 11:13:17
<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-03-18 14:18:36
<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-03-19 09:02:25
<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 + -