多线程网络编程,高手指教

boymaxzm 2003-08-25 03:22:39
// sd.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "sd.h"
#include "Afxmt.h"
#include "Afxsock.h"

//#include "drecordclient.h"
//#include "archivesock.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;


using namespace std;

CSocket *psock;
CSocketFile *file;
CArchive *arIn;
CArchive *arOut;
CEvent cs;
CString result;

UINT printfz(LPVOID pParam){
(*arOut)<<CString("zhangmi");
arOut->Flush();
Sleep(20);
(*arOut)<<CString("lovew");
arOut->Flush();
Sleep(20);
(*arIn)>>result;
AfxMessageBox(result);
arOut->Close();
arIn->Close();
file->Close();
psock->Close();
cs.SetEvent();
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
}
AfxSocketInit( NULL );
///****
psock=new CSocket;
psock->Create();
psock->Connect("127.0.0.1",7000);
file=new CSocketFile(psock);
arOut=new CArchive(file,CArchive::store);
arIn=new CArchive(file,CArchive::load);****///
CWinThread *pThreadA;
cs.ResetEvent();
pThreadA=AfxBeginThread(printfz,NULL,THREAD_PRIORITY_NORMAL);
WaitForSingleObject(cs,INFINITE);
delete arIn;
delete arOut;
delete file;
return nRetCode;
}

不能正常工作,当把 ///****
psock=new CSocket;
psock->Create();
psock->Connect("127.0.0.1",7000);
file=new CSocketFile(psock);
arOut=new CArchive(file,CArchive::store);
arIn=new CArchive(file,CArchive::load);****///
放在辅助线程则工作良好,我怀疑是CSocket不能在进程间共享,那位高手帮我一下
...全文
36 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypos 2003-09-10
  • 打赏
  • 举报
回复
msdn中有一个聊天室的例子你看过没有,具体名字我不记得了
boymaxzm 2003-09-10
  • 打赏
  • 举报
回复
以上各位的方法,小弟都试了一遍,都不行,不知道你们测试了没有
我之所以想用CArchieve,是想偷懒不用关心不同数据类型传送的时候的长度检查,编码和解码的问题
初学者,可能还有其他方法,我看到vc技术内幕上有CBlockSocket那个类写的怎么样?
是不是可以让CBlockSocket 结合CArchieve,来使编程简化,大家有什么高见?
zoutaiqi 2003-09-05
  • 打赏
  • 举报
回复
或者改为

// sd.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "sd.h"
#include "Afxmt.h"
#include "Afxsock.h"

//#include "drecordclient.h"
//#include "archivesock.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;
HANDLE hEvent;


using namespace std;

CSocket *psock;
CSocketFile *file;
CArchive *arIn;
CArchive *arOut;
CString result;

UINT printfz(LPVOID pParam){
(*arOut)<<CString("zhangmi");
arOut->Flush();
Sleep(20);
(*arOut)<<CString("lovew");
arOut->Flush();
Sleep(20);
(*arIn)>>result;
AfxMessageBox(result);
arOut->Close();
arIn->Close();
file->Close();
psock->Close();

delete arIn;
delete arOut;
delete file;
delete psock;
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
}
AfxSocketInit( NULL );
///****
psock=new CSocket;
psock->Create();
psock->Connect("127.0.0.1",7000);
file=new CSocketFile(psock);
arOut=new CArchive(file,CArchive::store);
arIn=new CArchive(file,CArchive::load);****///
CWinThread *pThreadA;

pThreadA=AfxBeginThread(printfz,NULL,THREAD_PRIORITY_NORMAL);

return nRetCode;
}
boymaxzm 2003-09-03
  • 打赏
  • 举报
回复
to xiaohyy(醉大饿极),我按照你的方法试过了,还是不行啊,唉~~~~
xiaohyy 2003-09-03
  • 打赏
  • 举报
回复
改为

// sd.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "sd.h"
#include "Afxmt.h"
#include "Afxsock.h"

//#include "drecordclient.h"
//#include "archivesock.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;
HANDLE hEvent;


using namespace std;

CSocket *psock;
CSocketFile *file;
CArchive *arIn;
CArchive *arOut;
CEvent cs;
CString result;

UINT printfz(LPVOID pParam){
(*arOut)<<CString("zhangmi");
arOut->Flush();
Sleep(20);
(*arOut)<<CString("lovew");
arOut->Flush();
Sleep(20);
(*arIn)>>result;
AfxMessageBox(result);
arOut->Close();
arIn->Close();
file->Close();
psock->Close();
::SetEvent(hEvent);
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
hEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
}
AfxSocketInit( NULL );
///****
psock=new CSocket;
psock->Create();
psock->Connect("127.0.0.1",7000);
file=new CSocketFile(psock);
arOut=new CArchive(file,CArchive::store);
arIn=new CArchive(file,CArchive::load);****///
CWinThread *pThreadA;

pThreadA=AfxBeginThread(printfz,NULL,THREAD_PRIORITY_NORMAL);
WaitForSingleObject(hEvent,INFINITE);
delete arIn;
delete arOut;
delete file;
return nRetCode;
}
redby 2003-09-03
  • 打赏
  • 举报
回复
老大,怎么还用CArchive啊,CSocket的Send方法和Receive方法还不够用吗?
pThreadA=AfxBeginThread(printfz,NULL,THREAD_PRIORITY_NORMAL);你传送参数了吗?
你可以把CSocket 实例,作为参数传个子线程啊。我用的时候是没问题的。
如:
//功能函数
void C…::test()
{
CSocket skt;
……

AfxBeginThread(_DealData,&skt);
}
线程函数:
UNIT _DealData(PVOID pv)
{
CSocket *pSkt = (CSocket*)pv;
……
}
flagfly 2003-09-03
  • 打赏
  • 举报
回复
在不同线程中使用同一socket确实会有很多问题
xiaohyy 2003-08-27
  • 打赏
  • 举报
回复
你的问题出在线程之间并未同步,CEvent对象并未正确初始化,
把CEvent cs;改为CEvent cs(TRUE,TRUE);试试
boymaxzm 2003-08-25
  • 打赏
  • 举报
回复
staticip(staticip)你指的map是不是handle和内存地址在每个线程内都有不同的对应关系?
staticip 2003-08-25
  • 打赏
  • 举报
回复
CSocket放在不同线程中使用会有很多问题,因为每个线程都有自己的map.

18,356

社区成员

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

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