📄 subject_66830.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> ASSERT(m_hSocket != INVALID_SOCKET);<BR><BR> _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;<BR>(!!!!!!)ASSERT(pState->m_hSocketWindow != NULL);(???????错误指向在此行???????????)<BR><BR> return WSAAsyncSelect(m_hSocket, pState->m_hSocketWindow,<BR> WM_SOCKET_NOTIFY, lEvent) != SOCKET_ERROR;<BR>}<BR><BR>但同样的一个套接字作为服务器监听的时候,没有客户连接时不会出错!请高手指点!特急!!!<BR><BR>BOOL CPoliceDlg::OnInitDialog()<BR>{<BR> CDialog::OnInitDialog();<BR><BR> // Set the icon for this dialog. The framework does this automatically<BR> // when the application's main window is not a dialog<BR> SetIcon(m_hIcon, TRUE); // Set big icon<BR> SetIcon(m_hIcon, FALSE); // Set small icon<BR> <BR> // TODO: Add extra initialization here<BR> CLogin loginDlg;<BR> if(loginDlg.DoModal()==IDOK)<BR> {<BR> // 用户登录成功,进入系统<BR> <BR> AfxBeginThread(ServerConnectThread,this); //开始同服务器建立联接<BR> }<BR> else<BR> {<BR> // 用户登录失败并放弃重登录,然后自动退出系统<BR> SendMessage(WM_CLOSE);<BR> }<BR> <BR><BR> return TRUE; // return TRUE unless you set the focus to a control<BR>}<BR><BR>void CPoliceDlg::OnExit() <BR>{<BR> // TODO: Add your control notification handler code here<BR>// AfxMessageBox("exit program!");<BR><BR> if(sockServer.IsBlocking())<BR> sockServer.CancelBlockingCall();<BR> sockServer.Close();<BR><BR> CDialog::OnCancel();<BR> <BR>}<BR><BR>static UINT ServerConnectThread(LPVOID lparam);//连接服务器的全局线程<BR>{<BR> <BR> int ret=sockServer.Create(0,SOCK_STREAM,NULL);<BR> if(ret==0)<BR> {<BR> AfxMessageBox("");<BR> return 0;<BR> }<BR><BR> ret=sockServer.Connect(localinfo.strip, 7000+localinfo.imacnum);<BR> if(ret==0)<BR> {<BR> AfxMessageBox("");<BR> sockServer.Close();<BR> return 0;<BR> }<BR> <BR> //AfxBeginThread(CPoliceDlg::ServerReceiveThread,lparam); //开始接收服务器数据线程<BR> //AfxMessageBox("连接服务器成功!");<BR><BR> 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 + -