socket通讯,高手帮忙了!

fishboyzyf 2006-04-10 01:33:48
现在我做个socket通过udp方式进行通讯,
现在有问题,我将socket在线程中创建后,
socket就接收不到发送给的消息,
同样的代码,在主框架窗口创建后就可以!
问一下高手,如何解决?是现在线程中创建socket并且能够
接收到消息?高手帮忙啊!
socket的创建方式如下:
class CUdpSvrSocket : public CAsyncSocket
{
// Attributes
public:

// Operations
public:
CUdpSvrSocket();
virtual ~CUdpSvrSocket();

// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CUdpSvrSocket)
public:
virtual void OnReceive(int nErrorCode);
//}}AFX_VIRTUAL

// Generated message map functions
//{{AFX_MSG(CUdpSvrSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

// Implementation

protected:

};
线程创建如下:
UINT LineThreadProc(LPVOID pParam)
{
// volatile int nTemp;
CoInitialize(NULL);
::WaitForSingleObject(g_eventStart, INFINITE);
CUdpSvrSocket * pListen;
pListen = new CUdpSvrSocket();
if(pListen->Create(7701,SOCK_DGRAM))
{
while(1)
{

if (::WaitForSingleObject(g_eventKill, 0) == WAIT_OBJECT_0)
{
break;
}
}
}

return 0; // ends the thread
}
...全文
181 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2006-04-12
  • 打赏
  • 举报
回复
CAsyncSocket放到主线程中,它有一个隐藏的窗口响应消息
Kudeet 2006-04-12
  • 打赏
  • 举报
回复
CAsyncSocket建议你在主线程中创建,不然问题会很多。因为使用了一个与主线程有关的隐藏的窗口来实现回调过程,或者把SOCKET直接做为全局变量,注意同步访问
Kudeet 2006-04-12
  • 打赏
  • 举报
回复
"Assertion failed - <app name>:File sockcore.cpp" error message when you use a multi-threaded application that uses MFC's socket classes
http://support.microsoft.com/KB/140527

How to pass a socket connection between threads in an MFC application in Visual C++
http://support.microsoft.com/kb/175668
fishboyzyf 2006-04-12
  • 打赏
  • 举报
回复
up
striking 2006-04-10
  • 打赏
  • 举报
回复
我不记得是哪个高手留下的. 我把它记下来. 引用这个高手的话. 版权归那个高手的:

CSocket只能在GUI线程中创建,MS的CSocket一般不是用来支持多线程的,因为MFC封的这个类使用了事件(窗口消息)这种I/O模型,并自己建了一个隐藏的窗口来收这些消息(类似于COM中的套间线程)。 建议放弃了CSocket,自己封了一个效果也许更好。如果在一个线程中创建socket,很容易发生Assert(m_hSockWnd != NULL)的问题。如果一定要用,可以参考
Message-Oriented TCP and Multithreaded Client/Server
http://support.microsoft.com/kb/192570/en-us
xundeng 2006-04-10
  • 打赏
  • 举报
回复
能在线程里创建SOCKET的 因为CAsyncSocke是民步的他要发消息到窗口,但是他的窗口句柄是保存在线程状态里的而每次使用的时候都是通过
AfxGetModuleThreadState()函数得到线程状态的。如果你在线程里创建SOCKET,在主线程 里是得不到所需要的窗口句柄的。所以就启动不了读事件了。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧