⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_66830.htm

📁 vc
💻 HTM
字号:
<p>
序号:66830 发表者:gws 发表日期:2003-12-26 19:28:46
<br>主题:CSocket????????
<br>内容:CSocket sockServer全局套接字变量,作为客户端;<BR><BR>在基于对话框的程序中使用CSOCKET时,在初始话函数BOOL CPoliceDlg::OnInitDialog()中启动连接服务器线程,<BR>可以连接成功,但是在退出程序时出现错误,单击重试时出现错误提示(在sockcore.cpp文件中),如下所示:<BR><BR>BOOL CAsyncSocket::AsyncSelect(long lEvent) (在sockcore.cpp中)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != INVALID_SOCKET);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;<BR>(!!!!!!)ASSERT(pState-&gt;m_hSocketWindow != NULL);(???????错误指向在此行???????????)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return WSAAsyncSelect(m_hSocket, pState-&gt;m_hSocketWindow,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_SOCKET_NOTIFY, lEvent) != SOCKET_ERROR;<BR>}<BR><BR>但同样的一个套接字作为服务器监听的时候,没有客户连接时不会出错!请高手指点!特急!!!<BR><BR>BOOL CPoliceDlg::OnInitDialog()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnInitDialog();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Set the icon for this dialog.&nbsp;&nbsp;The framework does this automatically<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;when the application's main window is not a dialog<BR>&nbsp;&nbsp;&nbsp;&nbsp;SetIcon(m_hIcon, TRUE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Set big icon<BR>&nbsp;&nbsp;&nbsp;&nbsp;SetIcon(m_hIcon, FALSE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Set small icon<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add extra initialization here<BR>&nbsp;&nbsp;&nbsp;&nbsp;CLogin loginDlg;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(loginDlg.DoModal()==IDOK)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 用户登录成功,进入系统<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxBeginThread(ServerConnectThread,this); //开始同服务器建立联接<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 用户登录失败并放弃重登录,然后自动退出系统<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(WM_CLOSE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;&nbsp;&nbsp;// return TRUE&nbsp;&nbsp;unless you set the focus to a control<BR>}<BR><BR>void CPoliceDlg::OnExit() <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your control notification handler code here<BR>//&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;exit program!&#34;);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if(sockServer.IsBlocking())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockServer.CancelBlockingCall();<BR>&nbsp;&nbsp;&nbsp;&nbsp;sockServer.Close();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnCancel();<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>}<BR><BR>static UINT ServerConnectThread(LPVOID lparam);//连接服务器的全局线程<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int ret=sockServer.Create(0,SOCK_STREAM,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(ret==0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;ret=sockServer.Connect(localinfo.strip, 7000+localinfo.imacnum);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(ret==0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockServer.Close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//AfxBeginThread(CPoliceDlg::ServerReceiveThread,lparam); //开始接收服务器数据线程<BR>&nbsp;&nbsp;&nbsp;&nbsp;//AfxMessageBox(&#34;连接服务器成功!&#34;);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 1;<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:BigJames 回复日期:2003-12-26 20:10:14
<br>内容:CSocket在线程之间使用会有问题。在线程之间共享一个CSocket实例只能使用标准的SOCKET句柄。就是通过CSocket::Detach和CSocket::Attach来做这件事情。<BR>你可以在线程里定义一个CSocket变量是一下,先不要使用全局变量。<BR>另外,我没有看到线程的开始有AfxSocketInit函数,这个需要调用一下。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:gws 回复日期:2003-12-27 15:20:07
<br>内容:非常感谢哥们的指点!<BR>服务器用的是常连接方式,所有的通讯都通过一个端口完成,所以我想在初始化中启动连接线程,然后在一个线程中完成所有的数据接收工作(发送自定义消息),一个线程完成数据发送工作。发送和接受都是阻塞性调用,一个线程能不能同时完成两个操作,接受和发送都是无序的?CSocket的行为是类似阻塞模式的,最好用CAsyncSocket来做???<BR><BR>不知道winsock控件使用怎么样?那个creat函数看不懂!<BR><BR>2003-12-27 17:22:50

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -