опубликован 06-02-2002 16:21 MSK
Да очень старая и больная тема..
Сам когдато более года искал книжку с описанием использования CSocket или CAsyncSocket
но находил чтото среднее межу справкой и описанием методов класса.И вот однажды нашёл и разобрался:
Значит создаем наследуюмый клас от CAsyncSocket назавем его CMySocket
переопределяем нужные виртуальные функ OnRecv OnSend OnConnect
Далее добавляем в клас CMySocket переменую, к примеру (если прога на диалоге)
то CDialog* p_mainwnd.
Теперь в клас диалога добавляем переменую нашего класса CMySocket
и гденибудь в OnInitDialog присваиваем указатель на диалговое окно
#define S_CLOSE 0
#define S_RECV 1
class CMyDialog : public CDialog
{
CMySocket m_sock;
...
В функцию
BOOL OnInitDialog()
{
m_sock.p_wnd=this;
....
return TRUE;
}
теперь создаем в класе диалога функ.
void CMyDialog::OnSockEvent(UCHAR type,int err)
{
switch(type)
{
case S_CLOSE://Соединение закрыто закрываем сокет
m_sock.Close();
TRACE("Соединение закрыто");
break;
case S_RESV://В гнездо поступили данные
char bufer[1025];
int buflen=1024;
int recvlen=0;
recvlen=m_sock.Receive(bufer,buflen);
bufer[recvlen]=NULL;
TRACE("Приняты данные: %s",buffer)
break;
}
}
А в классе CMySocket
в обьявления виртуальный функций встявляем такие строчки:
не забывает вставить в ! CMysocket.cpp файл
инклюдник от CMyDialog (CMyDialog.h)
void CMySocket::OnClose(int nErrorCode)
{
((CMyDialog*)m_pwnd)->OnSockEvent(S_CLOSE,nErrorCode);
CAsyncSocket::OnClose(nErrorCode);
}
void CMySocket::OnReceive(int nErrorCode)
{
((CMyDialog*)m_pwnd)->OnSockEvent(S_RECV,nErrorCode);
CAsyncSocket::OnReceive(nErrorCode);
}
Данный пример подрзумевает использование одлного статистического сокета.
Для конструкций типа CMySocket* p_sock=new CMySocket;
указатель на окно следует присваивать в переопределеном конструкторе
CMySocket::CMySocket(CDialog *p_mainwnd)
{
p_wnd=p_mainwnd;
}
также следует переделать фукцию CMyDialog OnSockEvent(UCHAR, type,int err)
на OnSockEvent(CMySocket* p_sock,UCHAR, type,int err)
и оперерировать с гнездами через указатели
switch(type)
{
case S_RECV://Прием данных от гнезда p_sock
char bufer[1025];
int buflen=1024;
int recvlen=0;
recvlen=p_sock->Receive(bufer,buflen);
bufer[recvlen]=NULL;
TRACE("Приняты данные: %s",buffer)
}
В данном примере опущены проверка ошибок.
С уважение приму критику старых и бывалых, пишущих на
API но новичкам легче освоить именно MFC, а потом при желании и API.