关于soctet和多线程的问题,请高手多指教。

zeclmj 2001-07-12 12:28:23
我在做一个代理服务器,用多线程,编译通过,运行时产生错误,见源码:
UINT GetRemoteData(LPVOID Pparam);

UINT GetRemoteData(LPVOID Pparam)
{
CProDlg *dlg=(CProDlg *)AfxGetMainWnd();
CSocket Server;
char Buffer[BUFFERSIZE+SERVERNAMEMAXSIZE];
CProxy *client=(CProxy *)Pparam;
int n =client->Receive(Buffer,BUFFERSIZE);
if (n == -1)
return 0;
Buffer[n] = 0;

if (!Server.Create ())
return 0;
.
.

return 0;
}


void CProxy::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CProDlg *dlg=(CProDlg *)AfxGetMainWnd();
CProxy *Client=new CProxy();
if(Accept(*Client))
AfxBeginThread(GetRemoteData,Client);
else
delete Client;
CSocket::OnAccept(nErrorCode);
}
把 if (!Server.Create ()) return 0; 这一行注释掉,就不会有错,为什么?调试时提示非法指针。
...全文
134 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcpro 2001-07-12
  • 打赏
  • 举报
回复
至少发现一个错误,你的CProxy是从CSocket派生的吧,线程间是不能直接传递CSocket的指针的,只能传socket句柄。你可以这样:
CProxy *Client=new CProxy();
if(Accept(*Client))
AfxBeginThread(GetRemoteData,Client.Detach());
...


UINT GetRemoteData(LPVOID Pparam)
{
CProDlg *dlg=(CProDlg *)AfxGetMainWnd();
CSocket Server;
char Buffer[BUFFERSIZE+SERVERNAMEMAXSIZE];
CProxy *client;
client->Attach((SOCKET)Pparam);
...
xxxbird 2001-07-12
  • 打赏
  • 举报
回复

Sorry, 我说错了,当我没说。

xxxbird 2001-07-12
  • 打赏
  • 举报
回复

>>if (!Server.Create ())
>> return 0;

Create的参数呢?


15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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