WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  ???WinSockets???

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   ???WinSockets???
Vic1 опубликован 04-02-2002 19:51 MSK   Click Here to See the Profile for Vic1   Click Here to Email Vic1  
Если кто знает, то подскажите. Как связать
handle основного окна с сокетом? Например, определил:
public://создаю новые объекты
CAsyncSocket ReceiveSock;//Создал объекты
CAsyncSocket SendSock;void ScAccept();
//Мои ф-ции
void ScConnect();
void ScReceive();
void ScSend();
void ScClose();
Далее в теле осн. проги определяю данные ф-ции:
void CSockDlg::ScAccept()
{
if(m_sListenSocket.Accept(m_sConnectSocket)==FALSE){AfxMessageBox("Accept Error!");}
else
{
AfxMessageBox("Accept is OK!");
GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
}
}
и т.д.(остальные ф-ции)
далее перехожу к созданию самого сокета
...................
if(m_iType == 0)//Если это клиент, то.
{
m_sConnectSocket.Create();
ScConnect();//Вызвали ф-ю Connect и активизировали всякие окошки!!!Повисли! Нет коннекта!
ScReceive();//Вызвали ф-ю Receive.

}
else//Значит это сервер.
{
m_sListenSocket.Create(m_iPort);
m_sListenSocket.Listen();
ScAccept();//!!!Вызвали ф-ю Accept и "подвисли"!!!Нет доступа!
//ScReceive();//Вызвали ф-ю Receive.
}
.................
Вопрос. А как здесь можно задействовать
virtual void OnAccept(int nErrorCode);
virtual void OnConnect(int nErrorCode);
и другие аналогичные им.

В форуме правильно упомяналося, что нужно
с хендлом основного окна их связать. Вопрос
а как? Можно значится создать новый класс.
типа class CMySocket : public CAsyncSocket
{
//и тута все определить
};
а потом ну там
void CMySocket::SetParent(...){//variable какая-то/указатель}
потом
void CMySocket::OnAccept(int nErrorCode)
{
if(nErrorCode==0)
(...)->OnAccept();
}
Но это же нужно цельный(лишний???)класс создавать!!!

technomag5@inbox.ru

delitant опубликован 04-02-2002 20:16 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
Если хочешь дам совет.
Не надо писать сетевые проги, используя классы MFC.
Если ты в действительности хочешь стать TPC программистом, то используй API функции. Если ты будешь писать, используя именно api, то ты вникнешь в самую суть сетевого программирования.
Vic1 опубликован 04-02-2002 20:40 MSK     Click Here to See the Profile for Vic1  Click Here to Email Vic1     
Спасибо конечно за совет, ну ес-но например на JAVA писать намного легче. Но есть MFC -
это факт. Есть проблема - это тоже факт.
С моей т.з. просто неправильно не использовать рекомендуемые классы или игнорировать их. Очевиден тот факт, что работать с ними можно. Тока надо знать как...

И еще. Вообще то я не профессиональный программер.

delitant опубликован 04-02-2002 21:03 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
А вообще-то если бы ты писал сетевые приложения на api под Windows.
То ты бы без особого труда смог бы разобраться в сетевой программе, которая написана, пою Unix или под другую OS. Дело в том, что чистое программирование socket ов в Win32 и Unix совпадают примерно на 97%. Разница очень не значительная. Если тебе такая переносимость не подходит, то используй CasyncSocket, дело добровольное, но факт остается фактом. Я даже встречал высказывания что сетевые приложения, написанные с помощью CasyncSocket просто мрут, виснут. Выбор за тобой.
>И еще. Вообще то я не профессиональный программер.
я то же
p.s. с год назад я также задал вопрос типа твоего, и мне также как и я тебе ответил. Честно скажу тебе. Я благодарен этому человеку
purpe опубликован 04-02-2002 23:00 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
я тож не профи, но после того как досканально разобрал исходник CAsyncSocket, то больше никаких вопросов не возникало ...
Drugan опубликован 06-02-2002 14:21 MSK     Click Here to See the Profile for Drugan  Click Here to Email Drugan     
Если тебе надо связать CAsyncSocket с окном, то это делается просто. Ты наследуешь класс (CAsyncSocket), добавляя к нему переменную-указатель на окно (например: CMyDialog *m_dlg;).
Вот и все.

А я так и не научился посылать широковещательные сообщения UDP :(

;(onflict

MADbI4 опубликован 06-02-2002 16:21 MSK     Click Here to See the Profile for MADbI4  Click Here to Email MADbI4     
Да очень старая и больная тема..
Сам когдато более года искал книжку с описанием использования 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.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.