其实到现在也没有用到CSocket类,只用了CAsyncSocket类,介绍几个问题吧,CSocket用到再记录:
1、如果你没有在mfc向导里面添加socket支持,那么你就应该包含afxsock.h头文件,更加需要注意的是一定要调用AfxSocketInit()对socket环境进行初始化
if(!AfxSocketInit())
{
AfxMessageBox("Socket Init error!");
return FALSE;
}
|
2、比较好的方法是单独创建一个类,比如CMySocket,并继承自CAsyncSocket类,声明一个实例
m_cmdSocket
,然后调用Create创建一个socket实例,如果是客户端,现在就可以调用Connect进行连接,如果是服务端就可以调用Listen进行监听,里面有个
FormatMessage函数,可以将
错误信息以字符串的形式输出出来,注意在Create的时候我只是监听了三种socket消息
//只写了服务端
if(!m_cmdSocket.Create(CPORT,SOCK_STREAM,FD_CONNECT|FD_ACCEPT|FD_CLOSE)) {
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL);
MessageBox((LPCTSTR)lpMsgBuf);
}
if(!m_cmdSocket.Listen())
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL);
MessageBox((LPCTSTR)lpMsgBuf);
m_cmdSocket.Close();
}
|
3、下面我们就可以在CMySocket类里面重写某些函数,比如OnAccept(int nErrorCode),这样就是处理Accept消息了。
void CDataSocket
::OnAccept
(int nErrorCode
)
void CDataSocket::OnAccept(int nErrorCode)
{
CAsyncSocket* pSocket = new CAsyncSocket;
Accept(*pSocket);//在此就获得了socket句柄
return;
}
|
4、我在使用过程中,明明已经重载了OnAccept函数,但是在函数里面设置断点却总是没有反应,查资料又查不到,最后实在国外的一个论坛上发现的,我声明变量的不是我自己的Socket类,而是CAsyncSocket类,导致重载无效,这是个杯具。待续
阅读(2668) | 评论(0) | 转发(0) |