Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

статьи / социологи_2 / winsockets - форум на исходниках

.htm
Скачиваний:
10
Добавлен:
10.12.2013
Размер:
20.35 Кб
Скачать

???WinSockets??? - Форум на исходниках 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         Если кто знает, то подскажите. Как связать

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             Если хочешь дам совет.

Не надо писать сетевые проги, используя классы MFC.

Если ты в действительности хочешь стать TPC программистом, то используй API функции. Если ты будешь писать, используя именно api, то ты вникнешь в самую суть сетевого программирования.

Vic1 опубликован 04-02-2002 20:40 MSK             Спасибо конечно за совет, ну ес-но например на JAVA писать намного легче. Но есть MFC -

это факт. Есть проблема - это тоже факт.

С моей т.з. просто неправильно не использовать рекомендуемые классы или игнорировать их. Очевиден тот факт, что работать с ними можно. Тока надо знать как... И еще. Вообще то я не профессиональный программер.

delitant опубликован 04-02-2002 21:03 MSK             А вообще-то если бы ты писал сетевые приложения на api под Windows.

То ты бы без особого труда смог бы разобраться в сетевой программе, которая написана, пою Unix или под другую OS. Дело в том, что чистое программирование socket ов в Win32 и Unix совпадают примерно на 97%. Разница очень не значительная. Если тебе такая переносимость не подходит, то используй CasyncSocket, дело добровольное, но факт остается фактом. Я даже встречал высказывания что сетевые приложения, написанные с помощью CasyncSocket просто мрут, виснут. Выбор за тобой.

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

я то же

p.s. с год назад я также задал вопрос типа твоего, и мне также как и я тебе ответил. Честно скажу тебе. Я благодарен этому человеку purpe опубликован 04-02-2002 23:00 MSK             я тож не профи, но после того как досканально разобрал исходник CAsyncSocket, то больше никаких вопросов не возникало ...

Drugan опубликован 06-02-2002 14:21 MSK             Если тебе надо связать CAsyncSocket с окном, то это делается просто. Ты наследуешь класс (CAsyncSocket), добавляя к нему переменную-указатель на окно (например: CMyDialog *m_dlg;).

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

MADbI4 опубликован 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.

СПРОСИТЬ  ОТВЕТИТЬ Перейти: ОсновнойC / C++ / Visual C++DelphiVisual BasicASMJava ScriptsJavaWindowsPascal

E-mail | http://www.sources.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.