Форум программистов CodeGuru
19 Сентябрь 2018, 00:02:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Winsock api, C/C++, тайсмер на connect(), нужна помощь  (Прочитано 20696 раз)
0 Пользователей и 1 Гость смотрят эту тему.
novice
Новичок
*
Офлайн Офлайн

Сообщений: 1


Просмотр профиля
« : 05 Январь 2008, 00:47:24 »

Доброго времени суток уважаемые программисты! Пишу небольшое приложение, проверяющее на доступность сетевой ресурс. С winsock api знаком недавно и появилась проблема: нужен таймаут хотя бы в 5 секунд, чтобы не ждать пока истечет время ожидания и приложение не разблокируется. Похожие примеры искал, но ничего доступно-похожего не нашел, хоть и понимаю что решение в неблокирующих сокетах. Код функции, отвечающей за проверку работает, поэтому привожу его ниже. Подправьте его пожалуйста или хотя бы подскажите что мне делать, если вас не затруднит. Заранее благодарен.

Код:
int scan(char* fip) {
   WSAData wsaData;
   int err = WSAStartup(MAKEWORD(2, 0), &wsaData);
   if (err != 0) { /*библиотека WinSock не загружена)*/ return 0; }
   char ServerName[30];
  sockaddr_in sin;
  SOCKET Sock;
   sin.sin_family = AF_INET;
   sin.sin_addr.s_addr=resolve(fip); // резолвим хост
   sin.sin_port = htons(21); // порт
   Sock = socket(AF_INET, SOCK_STREAM, 0); // открываем tcp сокет
   if (connect(Sock, (sockaddr*)&sin, sizeof(sin)) != SOCKET_ERROR) {
    recv(Sock, ServerName, 30, 0);
    // коннект состоялся
     closesocket(Sock);
     WSACleanup();
     return 1;
   }
   else {
   // коннект не состоялся
   closesocket(Sock);
   WSACleanup();
   return 0;
   }
}
Записан
Neco
Новичок
*
Офлайн Офлайн

Сообщений: 5


Просмотр профиля
« Ответ #1 : 06 Январь 2008, 13:23:09 »

н-да, вопрос...
попробуйте заглянуть в "unix. разработка сетевых приложений" стивенса.
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #2 : 08 Январь 2008, 17:19:00 »

Как вариант - эту процедуру (коннект/дисконнект) можно проделывать в отдельном потоке.
При этом, если приложение надо закрыть, можно просто убить поток при помощи TerminateThread.
Записан

ATAMAN200
Интересующийся
**
Офлайн Офлайн

Сообщений: 29


Просмотр профиля
« Ответ #3 : 03 Октябрь 2010, 14:14:45 »

Создание отдельного потока и таймера в нутри потока тогда таймер будет повторять поток и сам себя.
Но это так на самом деле вариантов много.
Код:
#include "conio.h"
#include "windows.h"
using namespace std;
HANDLE c;
DWORD b;
_int64 e;
char buff[4];
int mas[4];
DWORD WINAPI j(LPVOID)
{
WaitForSingleObject(c, INFINITE);
srand(time(0));
for(int i=0;i<4;i++)
{
mas[i]=rand()%192;
sprintf(buff, "%x", mas[i]);
cout << buff << "\t" << mas[i] << "\t\n";
}
c = CreateWaitableTimer(NULL, FALSE, NULL);
e = -1 * 10000000;
SetWaitableTimer(c, (LARGE_INTEGER*)&e, 0, NULL, NULL, FALSE);
CreateThread(NULL, 0, j, NULL, 0, &b);
return 0;
}
int main()
{
CreateThread(NULL, 0, j, NULL, 0, &b);
getch();
}

этот код генерирует случайные числа раз в секунду.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!