Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

WinSocket на MFC

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> WinSocket на MFC
Имя
Сообщение << Старые топики   Новые топики >>
WinSocket на MFC - 2010-05-29 18:58:00.760000   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
Программа проверят работает ли сервер или нет! Но нужен тайм аут! Потому что. когда происходит коннект к серверу программа блокируется. и весь смысл программы теряется, так как это занимает время. тоже самое можно сделать и в обычном браузере!
Я не могу понять через, что делать тайм аут =(
quote:


void CSockView::OnButton1()
{
&nbsp;&nbsp;&nbsp; UpdateData(TRUE);
&nbsp;&nbsp;&nbsp; CSocket cS;
&nbsp;&nbsp;&nbsp; cS.Create(0,SOCK_STREAM,NULL);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; if(cS.Connect(m_szEdit,m_szRadio))
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; AfxMessageBox("Сервер работает!");
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; AfxMessageBox("Сервер не работает или адрес введен не коректно!");
&nbsp;&nbsp;&nbsp; cS.Close();
}

Post #: 1
RE: WinSocket на MFC - 2010-05-31 07:24:10.816666   
Kali0stro

Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
Копни в сторону "неблокируемых сокетов"
Post #: 2
RE: WinSocket на MFC - 2010-05-31 15:05:18.586666   
Zmaster

Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
Или в сторону потоков на крайняк.
Post #: 3
RE: WinSocket на MFC - 2010-05-31 18:24:18.480000   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
да я б радостью, но у меня задание, чтоб обязательно был тайм аут =((
Post #: 4
RE: WinSocket на MFC - 2010-05-31 20:59:14.433333   
ZURKMOON

Сообщений: 54
Оценки: 0
Присоединился: 2010-05-12 14:01:30.280000
В си я плохо понимаю, и не могу понять слова блокируеться программа. Если под этим ты понимаешь подвисает, не отвечает, зависла, то вроде тебе только поток поможет, а там  и таймаут всунешь.
Post #: 5
RE: WinSocket на MFC - 2010-05-31 22:41:56.130000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Асинхронные сокеты, как писали выше. Никаких потоков не надо.
Post #: 6
RE: WinSocket на MFC - 2010-05-31 23:19:15.603333   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
CSocket асинхронныы сокет?!
вот нашел на одном сайте и не могу понять для меня есть. что-нибудь подходящие?
вызывается из Send при каждой неудачной попытке послать данные
(вернее, когда (CAsyncSocket::Send()==SOCKET_ERROR и
this->GetLastError()==WSAEWOULDBLOCK)
dwdTicksPassed — мс, примерно сколько прошло с начала попытки отправить
virtual bool VF_FeedBackFromSend_RetTrueIfNeedCancel(DWORD dwdTicksPassed)=0;


Post #: 7
RE: WinSocket на MFC - 2010-05-31 23:53:40.070000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: ZURKMOON

В си я плохо понимаю, и не могу понять слова блокируеться программа


тогда какого хрена ты тут вообще делаешь?

нет, ну мне правда интересно
Post #: 8
RE: WinSocket на MFC - 2010-06-01 07:26:14.923333   
Kali0stro

Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
quote:

CAsyncSocket

Здесь краткая информация по неблокируемым (асинхронным) сокетам.
И здесь.
Post #: 9
RE: WinSocket на MFC - 2010-06-01 16:17:36.013333   
smadov

Сообщений: 73
Оценки: 0
Присоединился: 2008-06-11 13:19:08.676666
это?
Post #: 10
RE: WinSocket на MFC - 2010-06-01 16:43:59.236666   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000

quote:

ORIGINAL: Zmaster

Или в сторону потоков на крайняк.

На счат поток ты был прав!Но про поток мне сказал препод и поменял задание =(
Теперь нужно разобраться с асинхронными сокетами.
и я окончательно запутался =(
CSocket и CAnsycSocket два асинхронных сокета или нет??
у меня было через CSocket, препод сказал, что это блокирующий сокет. тут http://www.xakep.ru/magazine/xa/061/090/1.asp написанно, что он асинхронный сокет, я вообеще запутался! помогите разобраться!
Post #: 11
RE: WinSocket на MFC - 2010-06-01 19:20:16.460000   
Kali0stro

Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
quote:

ORIGINAL: messenage

CSocket и CAnsycSocket два асинхронных сокета или нет??
у меня было через CSocket, препод сказал, что это блокирующий сокет. тут http://www.xakep.ru/magazine/xa/061/090/1.asp написанно, что он асинхронный сокет, я вообеще запутался! помогите разобраться!


ЗДЕСЬ статья по блокировке при использовании сокетов в MFC.

Немного выдержек:
quote:

Under Windows, blocking calls are considered bad practice. By default, CAsyncSocket supports asynchronous calls, and you must manage the blocking yourself using callback notifications. Class CSocket, on the other hand, is synchronous. It pumps Windows messages and manages blocking for you.

Перевод:
quote:

Под Windows, блокирующие вызовы считаются плохой практикой. По умолчанию CAsyncSocket поддерживает асинхронные вызовы, и вы должны управлять самостоятельно с помощью блокировки обратного уведомления. Класс CSocket, с другой стороны, синхроннен.


При этом CSocket является расширением класса CAsyncSocket и работает на более высоком уровне.

quote:

A socket can be in "blocking mode" or "nonblocking mode." The functions of sockets in blocking (or synchronous) mode do not return until they can complete their action. This is called blocking because the socket whose function was called cannot do anything — is blocked — until the call returns. A call to the Receive member function, for example, might take an arbitrarily long time to complete as it waits for the sending application to send (this is if you are using CSocket, or using CAsyncSocket with blocking). If a CAsyncSocket object is in nonblocking mode (operating asynchronously), the call returns immediately and the current error code, retrievable with the GetLastError member function, is WSAEWOULDBLOCK, indicating that the call would have blocked had it not returned immediately because of the mode. (CSocket never returns WSAEWOULDBLOCK. The class manages blocking for you.)

Перевод:
quote:

Сокет может быть в "режиме блокировки" или "неблокирующем режиме". Функции сокетов в блокировании (или синхронный режим) не возвращают управление, пока они не могут завершить свои действия. Это называется блокирование, поскольку сокет для которого была вызвана функция ничего не может сделать - это блокировка - до возврата вызова. Вызов Recieve функции, например, может занять сколь угодно долго завершения как он ждет отправки приложением (это если вы используете CSocket, или с использованием CAsyncSocket с блокировкой). Если CAsyncSocket Объект находится в неблокирующий режим (режим работы асинхронно), вызов возвращается немедленно и текущим кодом ошибки, извлекаемым с помощью GetLastError функции, является WSAEWOULDBLOCK, Указывая, что вызов был бы заблокирован, если бы не вернулся сразу же из-за режима. (CSocket никогда не возвращается WSAEWOULDBLOCK. Класс управляет блокировкой за вас.)


Таким образом ты сразу начал работать с СИНХРОННЫМИ сокетами.
Как говориться: "Потому и не кусают…" ;)
Post #: 12
RE: WinSocket на MFC - 2010-06-01 19:50:58.500000   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
quote:

Если CAsyncSocket Объект находится в неблокирующий режим (режим работы асинхронно), вызов возвращается немедленно и текущим кодом ошибки, извлекаемым с помощью GetLastError функции, является WSAEWOULDBLOCK, Указывая, что вызов был бы заблокирован, если бы не вернулся сразу же из-за режима. (CSocket никогда не возвращается WSAEWOULDBLOCK. Класс управляет блокировкой за вас.)


Тогда как понять или как сделать чтоб CAsyncSocket находился в неблокирующем режиме?

Случайно не с помощью этой ф-ии
int WSAAsyncSelect (SOCKET s, HWND hWnd, usigned int wMsg, long lEvent);
Post #: 13
RE: WinSocket на MFC - 2010-06-01 20:05:07.740000   
Kali0stro

Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
Читай ВНИМАТЕЛЬНО!
quote:

Под Windows, блокирующие вызовы считаются плохой практикой. По умолчанию CAsyncSocket поддерживает асинхронные вызовы, и вы должны управлять самостоятельно с помощью блокировки обратного уведомления

И вообще, стоит ознакомится с источниками! MSDN = библия хакера.
Ты разобраться хочешь, или чтобы за тебя написали?
Post #: 14
RE: WinSocket на MFC - 2010-06-01 20:09:13.680000   
Kali0stro

Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
Вот тебе ссылки:
Windows Sockets: Using Class CAsyncSocket
CAsyncSocket::Connect
CAsyncSocket::Accept
Post #: 15
RE: WinSocket на MFC - 2010-06-01 20:11:11.303333   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
я разобраться хочу =( и пытаюсь читать MSDN но пока что туго из-за хромого инглиша.
еще в данный момент нужно быстро, препод подвел =( сегодня посмотрел и сказал чтоб я все переделал под асинхронный сокет. а что-то пока не получается. а сдать нужно завтра =(

я тут написал кое что. но такое впечатление, что бред. потому что чтоб я не писал, выдет что сервер работает =(
Post #: 16
RE: WinSocket на MFC - 2010-06-02 22:39:46.293333   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
Как сделать, чтоб после обработки AfxMessageBox("Сервер не отвечает или адрес введен не корректно!"); уйти в начало программы, а то получается, когда нажимаешь ОК программа идет дальше и вызывает это сообщение  AfxMessageBox("Поздравляю, сервер работает =)!!!!!!!");,но в данной ситуации оно не должно его вызывать!
Post #: 17
RE: WinSocket на MFC - 2010-06-02 23:16:38.640000   
Lost_boy

Сообщений: 327
Оценки: 0
Присоединился: 2009-03-25 11:07:27.910000
Сделать цикл с брэйками и континуе?
Post #: 18
RE: WinSocket на MFC - 2010-06-03 09:10:05.276666   
messenage

Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
Извените затупил =( удалил случайно return и сидел тупил!
АА Блин снова забыл про тайм аут =(
&nbsp;&nbsp;UpdateData(TRUE); //========= Init &nbsp;WSADATA wsaData; &nbsp;if (!AfxSocketInit(&amp;wsaData)) &nbsp;{ &nbsp;&nbsp;AfxMessageBox("Error Unit"); &nbsp;&nbsp;return; &nbsp;} &nbsp;int S = WSAStartup(MAKEWORD(1,1),&amp;wsaData); &nbsp;if(S == INVALID_SOCKET) &nbsp;{ &nbsp;&nbsp;MessageBox("Èíèöèàëèçàöèÿ íå ïðîøëà!","Error!",MB_OK&nbsp; | MB_ICONSTOP); &nbsp;} //========= Create Sock &nbsp; &nbsp;s=socket(AF_INET,SOCK_STREAM,0); &nbsp;if (s == INVALID_SOCKET) &nbsp;&nbsp;MessageBox("Fatal Error", "Error", MB_OK); &nbsp;&nbsp; &nbsp;if(WSAAsyncSelect(s,GetSafeHwnd(), WM_CONNECT,FD_CONNECT) ==SOCKET_ERROR) &nbsp;&nbsp;MessageBox("Fatal Error", "Error", MB_OK); &nbsp;&nbsp; //========= Param Sock &nbsp;SOCKADDR_IN sAdd; &nbsp;memset(&amp;sAdd,0,sizeof(sAdd)); &nbsp;sAdd.sin_family = AF_INET; &nbsp;sAdd.sin_port = htons((u_short)m_szPort); &nbsp;sAdd.sin_addr.S_un.S_addr = inet_addr(m_szURL); &nbsp;if (sAdd.sin_addr.s_addr == INADDR_NONE) &nbsp;{ &nbsp;&nbsp; &nbsp;&nbsp;lPhost = gethostbyname(m_szURL); &nbsp;&nbsp;&nbsp;&nbsp;if (lPhost == NULL) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;AfxMessageBox("No Conecct!"); &nbsp;&nbsp;&nbsp;closesocket(s); &nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;} &nbsp;&nbsp;else &nbsp;&nbsp;memcpy((char FAR *)&amp;(sAdd.sin_addr ),lPhost-&gt;h_addr , lPhost-&gt;h_length);&nbsp;&nbsp; &nbsp;} //========= Connect &nbsp;if(connect(s,(struct sockaddr *)&amp;sAdd, sizeof(struct sockaddr))==SOCKET_ERROR) &nbsp;{ &nbsp;&nbsp;AfxMessageBox("Yes&nbsp;connect&nbsp;=)!!!!!!!"); &nbsp;&nbsp;&nbsp;closesocket(s); &nbsp;&nbsp;&nbsp; &nbsp;} &nbsp;WSACleanup();  если gethostbyname возращает NULL то коннекта нет и на этом как бы все!
но мня снова долбают с таймером. можно ли воспользываться этой ф-ей SleepEx(3,FALSE);?

Post #: 19
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> WinSocket на MFC







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.