应该可行的
给你个函数参考一下
void CSendView::OnConnect(WPARAM wparam, LPARAM lparam)
{
pFrame->m_wndStatusBar.SetPaneText(1,_T("客户机正在连接我端服务器..."));
//响应客户连接
SOCKET sServer=(SOCKET)wparam;
int nErrorCode = HIWORD(lparam);
int nMessage = LOWORD(lparam);
int nLength = sizeof(SOCKADDR_IN);
SOCKADDR_IN Client_Addr;
int nIndex;
CString m_Err_Message;
CConnect *pClient=new CConnect;
//保存客户机连接信息
nIndex=m_Connect.Add(pClient);
pClient->m_Connect=accept(sServer,(LPSOCKADDR)&Client_Addr,&nLength);
if(pClient->m_Connect==INVALID_SOCKET)
{
m_Err_Message.Format("错误:无法接受客户机连接SOCKET!,\n错误码:",WSAGetLastError());
AfxMessageBox(m_Err_Message);
m_Connect.RemoveAt(nIndex);
return ;
}
pClient->m_Address=inet_ntoa(Client_Addr.sin_addr);
//进行消息队列循环
::WSAAsyncSelect(pClient->m_Connect,m_hWnd,WM_SOCKET_READ,FD_READ|FD_CLOSE);
//创建连接客户端的子线程
pClient->m_Client=new CClientThread(GetSafeHwnd(),pClient->m_Connect,pClient->m_Address);
if( pClient->m_Client== NULL )
{
::MessageBox(GetSafeHwnd(),"无法创建连接子线程", "错误", MB_OK|MB_ICONSTOP );
return ;
}
pClient->m_Client->CreateThread();
pFrame->m_wndStatusBar.SetPaneText(1,_T("连接完毕..."));
if(!App.Gl_Begin)
pClient->m_Client->PostThreadMessage(WM_SOCKET_SEND_DATA,(WPARAM)ReturnMessage(),0L);
}其中CServerThread、CClientThread都是由CWinThread继承的,你先参考一下,有问题[email protected],一同研究
给你个函数参考一下
void CSendView::OnConnect(WPARAM wparam, LPARAM lparam)
{
pFrame->m_wndStatusBar.SetPaneText(1,_T("客户机正在连接我端服务器..."));
//响应客户连接
SOCKET sServer=(SOCKET)wparam;
int nErrorCode = HIWORD(lparam);
int nMessage = LOWORD(lparam);
int nLength = sizeof(SOCKADDR_IN);
SOCKADDR_IN Client_Addr;
int nIndex;
CString m_Err_Message;
CConnect *pClient=new CConnect;
//保存客户机连接信息
nIndex=m_Connect.Add(pClient);
pClient->m_Connect=accept(sServer,(LPSOCKADDR)&Client_Addr,&nLength);
if(pClient->m_Connect==INVALID_SOCKET)
{
m_Err_Message.Format("错误:无法接受客户机连接SOCKET!,\n错误码:",WSAGetLastError());
AfxMessageBox(m_Err_Message);
m_Connect.RemoveAt(nIndex);
return ;
}
pClient->m_Address=inet_ntoa(Client_Addr.sin_addr);
//进行消息队列循环
::WSAAsyncSelect(pClient->m_Connect,m_hWnd,WM_SOCKET_READ,FD_READ|FD_CLOSE);
//创建连接客户端的子线程
pClient->m_Client=new CClientThread(GetSafeHwnd(),pClient->m_Connect,pClient->m_Address);
if( pClient->m_Client== NULL )
{
::MessageBox(GetSafeHwnd(),"无法创建连接子线程", "错误", MB_OK|MB_ICONSTOP );
return ;
}
pClient->m_Client->CreateThread();
pFrame->m_wndStatusBar.SetPaneText(1,_T("连接完毕..."));
if(!App.Gl_Begin)
pClient->m_Client->PostThreadMessage(WM_SOCKET_SEND_DATA,(WPARAM)ReturnMessage(),0L);
}其中CServerThread、CClientThread都是由CWinThread继承的,你先参考一下,有问题[email protected],一同研究
解决方案 »
- unresolved external symbol __imp__WSACleanup@0"
- 如何在view类中销毁一个模态的对话框?
- 问一下,接口IWebBrowser2中哪个成员函数是获得HTML的反馈内容的或者HTML源代码的?
- 请问Radio Button能添加变量吗?
- MFC的消息响应机制和WIN32的消息响应机制相同吗?有什么不同,为什么不同
- 一个程序如何才能打开多种格式的文件,如rtf、doc、html
- MFC24位位图转8位位图问题,希望大家帮忙
- 汇编相关,请高手帮忙
- 如何自定义消息
- 如何用VC编写最简单的数据库应用程序?
- 关于sprintf()和FILE *fp
- ado字段更新并写入数据库表的问题
BOOL CTryDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_pThread = AfxBeginThread((AFX_THREADPROC)ThrdFunc,(LPVOID)this); return TRUE;
}UINT ThrdFunc(LPVOID pParam)
{
CTryDlg* pDlg = (CTryDlg*)pParam; pDlg->m_pSocket = new CMySocket();
if(!pDlg->m_pSocket->Create())
{
delete pDlg->m_pSocket;
AfxMessageBox("ERROR!");
}
return 0L;
}
其中m_pSocket是CTryDlg的puclic成员,类型CMysocket*;
m_pThread同上,类型CWinThread*;CMySocket由CSocket派生。
你还是用动态连接吧!要不就直接用API。
实际上我的m_psocket在线程外也要用,
否则我根本就不会这样写——直接在线程
里定义套接字就完了。
你应该传递这个句柄hSocket,然后用detach()和attach(),
来重新构造一个CSocket对象。
微软的CAsyncSocket有很多问题的,我也出过不少问题了,
建议你看看这个类的实现代码,就明白这些问题的根源了。
这问题,以前也见过类似的文档,
总算有人说到点上了。
照begin你的意思,是要在线程外建立socket,
然后传句柄进去。麻烦你给点代码瞻仰瞻仰,谢过!
好了,差不多了。
一.服务器程序.
二.客户端程序.
作为服务器程序很少用CSocket的什么,用什么连接池,请求池,线程池.
客户端还可以考虑.可以直接用一个线程驱动CSocket.这样可以实现异步连接.
将整个系统的数据交互集中在一起作,有理于模块独立.
xmake,你说的连接池,请求池,线程池可以去什么地方看看?
连接池,请求池,线程池只有win2000才能用吧.
UINT SendData(LPVOID Param)
{
CXXXDlg* pDlg = (CXXXDlg*)Param;
...
CSocket* pSocket = new CSocket();
pSocket->Attach(pdlg->m_pSocket->m_hSocket);
pSocket->Create();
}
惨得很,还是错了,怎么回事?
CSocket* pSocket = new CSocket();
pDlg->m_pSocket=new CSocket();
pSocket->Create();
pDlg->m_pSocket->Attach(pSocket->m_hSocket);
CMapPtrToPtr::GetValueAt(void* key) const
中的m_pHashTable错误。
m_pclitSocket->Detach();
在线程函数的入口加乐AfxSockInit()就好了。
不过具体原因还是不太懂,在请指点一下?
下次还是用WinSock API吧。
这个一个IE控件程序SOCK通信进程序是用来做口令验证用的
我的QQ是1271891
请多多指点 SOCKET wsSock,temp;
CString str[3],wangdian;
char szhostname[128];
int i,iph=0; str[iph]="";
if( gethostname(szhostname, 128) == 0 )
{
// get host adresses
struct hostent * phost;
CString addr;
phost = gethostbyname(szhostname);
int j;
for( i = 0; phost!= NULL && phost->h_addr_list[i]!= NULL; i++ )
{
for( j = 0; j!=4; j++ )
{
if( j > 0 )
str[i] += ".";
addr.Format("%u", (unsigned int)((unsigned
char*)phost->h_addr_list[i])[j]);
str[i] += addr;
}
// str now contains one local ip address - do whatever you want to do with it (probably add it to a list)
}
}
//STR 出来是本地的IP ,可以有多个IP
//szhostname,本地电脑的名子
if(i!=1)iph=0;
struct sockaddr_in clhere;wsSock= socket( AF_INET, SOCK_STREAM, 0);
if (wsSock == INVALID_SOCKET)
{
closesocket(wsSock);
return false;
}//给全部本地IP,套接
clhere.sin_family=AF_INET;
clhere.sin_addr.s_addr=inet_addr(LPCTSTR(str[iph]));
//here.sin_addr.s_addr=inet_addr("192.168.0.1");
clhere.sin_port=htons(7711); if(bind(wsSock,(LPSOCKADDR)&clhere,sizeof(clhere)))
{
// MessageBox(m_hwndIE,"接收套接字绑定失败!","",MB_OK); }
int fromlen = sizeof(clhere); struct sockaddr_in here;
here.sin_family=AF_INET;
here.sin_addr.s_addr=inet_addr("192.168.0.1");
here.sin_port=htons(5816);int status= sizeof(here);
//调用阻塞函数accept,一直到远端响应为止listen(wsSock,5);
while(1)
{
temp = accept( wsSock,(struct sockaddr*)&here,&status);
closesocket(temp);
}
这个也要用的不知到为什么请高手指点
// setup maps and lists specific to socket state
_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
Service Pack 3 更正的错误:
下列 MFC 问题已经被更正:MFC 6.0 可以使用 Microsoft(R) Access 2000 数据库。若要在应用程序中使用此功能,必须使用下例方法启用 DAO 3.6:
在进行任何与数据库相关的调用前,链接 DLL 版的 MFC,并将下列行添至 InitInstance 中:
AfxGetModuleState()->m_dwVersion = 0x0601
在 _MFC_VER 设置为 0x0601 后重新编译 MFC 静态库。
对于未使用文档/视图结构的 SDI 应用程序,MFC AppWizard 为工具栏按钮关联了不正确的图像。
在多线程的静态链接 MFC 应用程序中,套接字线程的状态未被初始化。如果应用程序中的某一线程调用了 AfxSocketInit,那么再从其他线程中进一步地调用该相同函数时,将不能为该线程设置套接字线程的状态。
……
zhangzq71,简单的描述如下:
UINT SendData(LPVOID Param)
{
CXXXDlg* pDlg = (CXXXDlg*)Param;
...
AfxSockInit();
CSocket* pSocket = new CSocket();
pSocket->FromHandle(pDlg->m_pSocket->m_hSocket);
pSocket->Create();
...
delete pSocket;
return 0L;
}
我天天用她
还有个头文件Afxsock.h
{
// TODO: perform and per-thread initialization here
CSocketThreadBase ::InitInstance();
TimeSetEvent();
m_pSocket = new CClientSocket(this);
m_pSocket->Attach(m_hClientSocket);
ASSERT_VALID(m_pSocket);
m_pSocket->CreatePointer();
m_eventSocketConnected.SetEvent();
TRACE("CClientThread: connected");
return TRUE;
}
CClientThread::CClientThread(CListeningThread *pListeningThread,SOCKET hClientSocket)
{
m_pSocket=NULL;
m_hClientSocket=hClientSocket;
m_pListeningThread=pListeningThread;
}
void CListeningThread::OnCreateSocket(WPARAM wParam, LPARAM lParam)
{
m_pListeningSocket = new CListeningSocket(this);
if (m_pListeningSocket->Create(g_SocketOption.nPort))
{
if (m_pListeningSocket->Listen()) {
g_ClientCount=0;
return ;
}
}
delete m_pListeningSocket;
m_pListeningSocket = NULL;
}
以上都是假定,嘻嘻~
CMyDialog::CDialog
{
CServerPocess *pServer;
}
在global建立线程函数
{
CMyDialog* serverdlg=(CMyDialog*)theApp.m_pMainWnd;
CServerPocess* server = serverdlg->pServer;
}
CServerPocess是我封装的一个Socket类
得到了SOCKET,然后随便做什么了!
,发信完关闭.