一个CAsyncSocket的MultiThreading问题,处女问

windyguy 2003-08-23 12:28:54
先贴代码,开始thread后,一到ListenSocket.FromHandle((SOCKET)pParam)
程序就出错,我跟踪了一下,发现pParam的值是0x01c……汗

不知道是什么原因,我尝试过用全局变量CAsyncSocket g_ListenSocket,然后
不使用detach,attach的方法,仍然是出错,一在线程里面使用Socket就出错。

我刚开始做这个,在csdn上第一次发问,谢谢各位了

void CBlindChatServer2Dlg::OnOK()
{
// TODO: Add extra validation here
// "开始Listen"按钮的响应函数
m_btnOk.EnableWindow(FALSE);

g_ListenSocket.Listen(5);
g_isListen = 1;
SOCKET tmpSocket;
tmpSocket = g_ListenSocket.Detach();

AfxBeginThread(serverThreadProc,(LPVOID)tmpSocket);
}



UINT serverThreadProc(LPVOID pParam)
{
CAsyncSocket hServerSocket;
CAsyncSocket ListenSocket;
ListenSocket.FromHandle((SOCKET)pParam);

int idConnect = 0;
char recBuffer[50];
int recLenth;
int rCode;

while(!ListenSocket.Accept(hServerSocket))
{
...全文
86 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
windyguy 2003-08-30
  • 打赏
  • 举报
回复
恩,那个我开始用的也是Attach,不过后来因为不断测试(没线程初始化前),搞得很郁闷
才改的,后来还是改回了Attach。
我并没有在两个线程中同时使用CAsyncSocket,这点我还是清楚的,我都会Detach/Attach的。

至于标题……,你不会指望一个处女过来提这种问题吧?呵呵,所以自然是first asking
dawndu 2003-08-29
  • 打赏
  • 举报
回复
哈哈,你问的标题有问题噢,处女问=处女问问题or=第一次问问题?
everandforever 2003-08-29
  • 打赏
  • 举报
回复
tmpSocket = g_ListenSocket.Detach();

ListenSocket.FromHandle((SOCKET)pParam);//这里应该ATTACH吧?

用 DETACH/ATTACH 可以实现在线程之间的传递.
不录 2003-08-29
  • 打赏
  • 举报
回复
MFC的Socket类并不适合用于多线程,这主要是使用了WSAAsyncSelect要和窗口句柄发生关系的原因,因为窗口是属于线程所有,所以如果一个Socket类跨越两个线程,则会出现异常,当然这个异常是由ASSERT引发的,所以在Release版中不会出问题,但在Debug版中会出问题。
windyguy 2003-08-29
  • 打赏
  • 举报
回复
楼上的兄弟多谢了,我真的是很想知道有什么问题。

因为程序已经能够运行了,没感觉有什么问题……,所以这样就更郁闷,
感觉就是可能程序出了设计期的问题,是一个很拙劣的设计。

顺便说说我的设计,就是线程始终accept,知道接收到一个连接,然后打开一个新的线程
继续accept,而当前线程就开始通信。
顺便贴贴初始化代码:
#ifndef _AFXDLL

#define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE

#define _afxSockThreadState AfxGetModuleThreadState()



_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;

if (pState->m_pmapSocketHandle == NULL)

pState->m_pmapSocketHandle = new CMapPtrToPtr;

if (pState->m_pmapDeadSockets == NULL)

pState->m_pmapDeadSockets = new CMapPtrToPtr;

if (pState->m_plistSocketNotifications == NULL)

pState->m_plistSocketNotifications = new CPtrList;

#endif

nicolas2001 2003-08-29
  • 打赏
  • 举报
回复
除了没有线程中初始化,没有觉得有什么问题,我没有学过线程安全,我不懂!
帮你顶!
请高手指教!
nicolas2001 2003-08-29
  • 打赏
  • 举报
回复
对于线程的安全问题,我不懂。
除了你没有初始化,没感觉你的程序有什么毛病!
windyguy 2003-08-29
  • 打赏
  • 举报
回复
其实从知道CSocket类到写出这些代码,只有一天,后来还是完成了那个东西,我想知道
这个程序有什么不对的地方,难道是应该用Atatch而不是fromhandle?这个我后来修改了

这之前我只有过一次大概6小时的VC MFC经验,但是vc用过一段时间,为了完成一个驱动,
只是把vc作为编写平台用。所以经验相当不足:)

如果有什么问题,请直接指出来好么?
windyguy 2003-08-29
  • 打赏
  • 举报
回复
ft,就算写得不好也不用讽刺吧,呵呵,这以前连vc都没怎么用过。

至于这个问题,不是线程安全的问题,是因为如果使用Static Link的话,在线程
中无法使用Socket的,各位可以试下,我在一个国外论坛上search到了解决方案
蒋晟 2003-08-27
  • 打赏
  • 举报
回复
凡是涉及句柄映射的MFC类都不是线程安全的

Command what is yours
Conquer what is not
windyguy 2003-08-23
  • 打赏
  • 举报
回复
没人帮忙么?
zhouyong0371 2003-08-23
  • 打赏
  • 举报
回复
高,哈哈
flinming 2003-08-23
  • 打赏
  • 举报
回复
up
UDX协议 2003-08-23
  • 打赏
  • 举报
回复
其实我佩服,你能写出这样的代码!!!!
windyguy 2003-08-23
  • 打赏
  • 举报
回复
虽然没人回答,还是多谢了,呵呵

找到答案了,因为没有在线程中初始化Socket……

18,356

社区成员

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

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