WinSocket на MFC
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
WinSocket на MFC - 2010-05-29 18:58:00.760000
|
|
|
messenage
Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
|
Программа проверят работает ли сервер или нет! Но нужен тайм аут! Потому что. когда происходит коннект к серверу программа блокируется. и весь смысл программы теряется, так как это занимает время. тоже самое можно сделать и в обычном браузере! Я не могу понять через, что делать тайм аут =( quote:
void CSockView::OnButton1() { UpdateData(TRUE); CSocket cS; cS.Create(0,SOCK_STREAM,NULL); if(cS.Connect(m_szEdit,m_szRadio)) { AfxMessageBox("Сервер работает!"); } else AfxMessageBox("Сервер не работает или адрес введен не коректно!"); cS.Close(); }
|
|
|
RE: WinSocket на MFC - 2010-05-31 07:24:10.816666
|
|
|
Kali0stro
Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
|
Копни в сторону "неблокируемых сокетов"
|
|
|
RE: WinSocket на MFC - 2010-05-31 15:05:18.586666
|
|
|
Zmaster
Сообщений: 930
Оценки: 0
Присоединился: 2007-02-09 19:02:43.500000
|
Или в сторону потоков на крайняк.
|
|
|
RE: WinSocket на MFC - 2010-05-31 18:24:18.480000
|
|
|
messenage
Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
|
да я б радостью, но у меня задание, чтоб обязательно был тайм аут =((
|
|
|
RE: WinSocket на MFC - 2010-05-31 20:59:14.433333
|
|
|
ZURKMOON
Сообщений: 54
Оценки: 0
Присоединился: 2010-05-12 14:01:30.280000
|
В си я плохо понимаю, и не могу понять слова блокируеться программа. Если под этим ты понимаешь подвисает, не отвечает, зависла, то вроде тебе только поток поможет, а там и таймаут всунешь.
|
|
|
RE: WinSocket на MFC - 2010-05-31 22:41:56.130000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Асинхронные сокеты, как писали выше. Никаких потоков не надо.
|
|
|
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;
|
|
|
RE: WinSocket на MFC - 2010-05-31 23:53:40.070000
|
|
|
Denaturat
Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
|
quote:
ORIGINAL: ZURKMOON В си я плохо понимаю, и не могу понять слова блокируеться программа тогда какого хрена ты тут вообще делаешь? нет, ну мне правда интересно
|
|
|
RE: WinSocket на MFC - 2010-06-01 07:26:14.923333
|
|
|
Kali0stro
Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
|
quote:
CAsyncSocket Здесь краткая информация по неблокируемым (асинхронным) сокетам. И здесь.
|
|
|
RE: WinSocket на MFC - 2010-06-01 16:17:36.013333
|
|
|
smadov
Сообщений: 73
Оценки: 0
Присоединился: 2008-06-11 13:19:08.676666
|
это?
|
|
|
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 написанно, что он асинхронный сокет, я вообеще запутался! помогите разобраться!
|
|
|
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. Класс управляет блокировкой за вас.) Таким образом ты сразу начал работать с СИНХРОННЫМИ сокетами. Как говориться: "Потому и не кусают…" ;)
|
|
|
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);
|
|
|
RE: WinSocket на MFC - 2010-06-01 20:05:07.740000
|
|
|
Kali0stro
Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
|
Читай ВНИМАТЕЛЬНО! quote:
Под Windows, блокирующие вызовы считаются плохой практикой. По умолчанию CAsyncSocket поддерживает асинхронные вызовы, и вы должны управлять самостоятельно с помощью блокировки обратного уведомления И вообще, стоит ознакомится с источниками! MSDN = библия хакера. Ты разобраться хочешь, или чтобы за тебя написали?
|
|
|
RE: WinSocket на MFC - 2010-06-01 20:11:11.303333
|
|
|
messenage
Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
|
я разобраться хочу =( и пытаюсь читать MSDN но пока что туго из-за хромого инглиша. еще в данный момент нужно быстро, препод подвел =( сегодня посмотрел и сказал чтоб я все переделал под асинхронный сокет. а что-то пока не получается. а сдать нужно завтра =( я тут написал кое что. но такое впечатление, что бред. потому что чтоб я не писал, выдет что сервер работает =(
|
|
|
RE: WinSocket на MFC - 2010-06-02 22:39:46.293333
|
|
|
messenage
Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
|
Как сделать, чтоб после обработки AfxMessageBox("Сервер не отвечает или адрес введен не корректно!"); уйти в начало программы, а то получается, когда нажимаешь ОК программа идет дальше и вызывает это сообщение AfxMessageBox("Поздравляю, сервер работает =)!!!!!!!");,но в данной ситуации оно не должно его вызывать!
|
|
|
RE: WinSocket на MFC - 2010-06-02 23:16:38.640000
|
|
|
Lost_boy
Сообщений: 327
Оценки: 0
Присоединился: 2009-03-25 11:07:27.910000
|
Сделать цикл с брэйками и континуе?
|
|
|
RE: WinSocket на MFC - 2010-06-03 09:10:05.276666
|
|
|
messenage
Сообщений: 21
Оценки: 0
Присоединился: 2010-03-03 21:23:49.290000
|
Извените затупил =( удалил случайно return и сидел тупил! АА Блин снова забыл про тайм аут =(
UpdateData(TRUE);
//========= Init
WSADATA wsaData;
if (!AfxSocketInit(&wsaData))
{
AfxMessageBox("Error Unit");
return;
}
int S = WSAStartup(MAKEWORD(1,1),&wsaData);
if(S == INVALID_SOCKET)
{
MessageBox("Èíèöèàëèçàöèÿ íå ïðîøëà!","Error!",MB_OK | MB_ICONSTOP);
}
//========= Create Sock
s=socket(AF_INET,SOCK_STREAM,0);
if (s == INVALID_SOCKET)
MessageBox("Fatal Error", "Error", MB_OK);
if(WSAAsyncSelect(s,GetSafeHwnd(), WM_CONNECT,FD_CONNECT) ==SOCKET_ERROR)
MessageBox("Fatal Error", "Error", MB_OK);
//========= Param Sock
SOCKADDR_IN sAdd;
memset(&sAdd,0,sizeof(sAdd));
sAdd.sin_family = AF_INET;
sAdd.sin_port = htons((u_short)m_szPort);
sAdd.sin_addr.S_un.S_addr = inet_addr(m_szURL);
if (sAdd.sin_addr.s_addr == INADDR_NONE)
{
lPhost = gethostbyname(m_szURL);
if (lPhost == NULL)
{
AfxMessageBox("No Conecct!");
closesocket(s);
return;
}
else
memcpy((char FAR *)&(sAdd.sin_addr ),lPhost->h_addr , lPhost->h_length);
}
//========= Connect
if(connect(s,(struct sockaddr *)&sAdd, sizeof(struct sockaddr))==SOCKET_ERROR)
{
AfxMessageBox("Yes connect =)!!!!!!!");
closesocket(s);
}
WSACleanup();
если gethostbyname возращает NULL то коннекта нет и на этом как бы все! но мня снова долбают с таймером. можно ли воспользываться этой ф-ей SleepEx(3,FALSE);?
|
|
|
|
|