Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Таймаут ожидания коннекта

16K
27 июля 2008 года
4nob1oz
34 / / 14.06.2007
Народ никак не могу додуматься уже 2-ой день. Вот код
Код:
#include <windows.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

#pragma comment(linker,"/entry:main")

int main(int argc, char* argv[])
{
  WSADATA wsaData;
  SOCKET sockid,consock;
  struct sockaddr_in idsin;
  int i=0;
 
  idsin.sin_family = AF_INET;
  idsin.sin_addr.s_addr = 0;
  idsin.sin_port = htons(4444);

  i = sizeof(idsin);

  WSAStartup(MAKEWORD(2,2), &wsaData);
  sockid = socket(AF_INET, SOCK_STREAM, 0);
  if (sockid == INVALID_SOCKET) { printf("Can't create socket...\n"); return 0; }
  bind(sockid,(struct sockaddr *)&idsin, i);
  listen(sockid, 10);

  while (1)
  {
      consock = accept(sockid, (struct sockaddr *)&idsin, &i);
      if (consock != INVALID_SOCKET)
      {
          MessageBox(NULL,"Connected to...","title",MB_OK);
          break;
      }
     Sleep(500);
  }

  return 0;
}

Никак не могу написать, чтобы если в течение 5 секнуд не пришло коннекта на забинденный порт то закрывать сокет. Все мля перепробовал и какие тока извраты не делал так и не понял как сделать. Народ помогите с решением проблемы, код привел без лишнего бреда который я там накодел, чтобы легко можно было его исправить =)
288
28 июля 2008 года
nikitozz
1.2K / / 09.03.2007
А разве вот так не пойдет
Код:
int nAttempt = 0;
  while (nAttempt <= 10)
  {
      consock = accept(sockid, (struct sockaddr *)&idsin, &i);
      if (consock != INVALID_SOCKET)
      {
          MessageBox(NULL,"Connected to...","title",MB_OK);
          break;
      }
            nAttempt++;
     Sleep(500);
  }

А после цикла просто проверяешь значение nAttempt и узнаешь причину завершения цикла.
16K
28 июля 2008 года
4nob1oz
34 / / 14.06.2007
Ага с блокирующими сокетами цикл делать, оч смешно =) Скомпилил бы для начала и проверил. Спасиб за ответ конешн но все равно не катит даже если неблокирующие сокеты сделать и проверять не истекло ли 10 секунд например так.
 
Код:
DWORD dwEnd = GetTickCount()/1000 + 10 /* 10 sec */

while(dwEnd > GetTickCount()/1000)
{
    ....
}


Все равно не подходит нифига для решения моей задачи. Именно нужны таймауты.
Как то сделать точно можно но нифига не понимаю как. С неблокирующими сокетами както можно сделать но у меня не получается и с ним =(
288
28 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: 4nob1oz
Ага с блокирующими сокетами цикл делать, оч смешно =) Скомпилил бы для начала и проверил.


Ну во-первых, цикл был в Вашем же исходники, я лишь чуть его подправил. ))
Во-вторых, подобный цикл сам по себе подразумевает использование неблокирующих сокетов, иначе зачем тогда вообще нужен такой цикл (с break'ом после первого же соединения).
В Вашем случае - возможно использование второго потока и какого- нибудь Event'а.

398
28 июля 2008 года
Alexandoros
630 / / 21.10.2005
Цитата:

Никак не могу написать, чтобы если в течение 5 секнуд не пришло коннекта на забинденный порт то закрывать сокет. Все мля перепробовал и какие тока извраты не делал так и не понял как сделать. Народ помогите с решением проблемы, код привел без лишнего бреда который я там накодел, чтобы легко можно было его исправить =)



Асинхронные сокеты + WSAAccept

ПС C блокирующими для чтения записи работае setsockopt + SO_RCVTIMEO/SO_SNDTIMEO. Но хз как оно с аццептом пашет.

ППС синронные сокеты - зло.

16K
28 июля 2008 года
4nob1oz
34 / / 14.06.2007
Че по делу посказать трудно чтоли =\ Я и так знаю функции и какие сокеты есть. Я блин накодеть не могу =\ Кое как сделал
Код:
#include <windows.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

#pragma comment(linker,"/entry:main")

#define PORT 4444

int main(int argc, char* argv[])
{
  WSADATA wsaData;
  SOCKET sockid,consock;
  struct sockaddr_in idsin;
  struct timeval tv;
  fd_set sock;
  unsigned long on_sock = 1,off_sock = 0;
  int i=0;

  ZeroMemory(&tv,sizeof(tv));

  WSAStartup(MAKEWORD(2,2), &wsaData);
 
  i = sizeof(idsin);
  tv.tv_sec = 5;
 
  idsin.sin_family = AF_INET;
  idsin.sin_addr.s_addr = inet_addr("127.0.0.1");
  idsin.sin_port = htons(PORT);

  sockid = socket(AF_INET, SOCK_STREAM, 0);

  if (sockid == INVALID_SOCKET) { printf("Can't create socket...\n"); return 0; }

  ioctlsocket(sockid, FIONBIO,&on_sock);
  bind(sockid,(struct sockaddr *)&idsin, i);
  listen(sockid, 10);
 
  FD_ZERO(&sock);
  FD_SET(sockid,&sock);
   
  while (1)
  {
      consock = accept(sockid, (struct sockaddr *)&idsin, &i);
      if(select(sockid+1, &sock, NULL, NULL, &tv )==0)
      {
          printf("\nConnection timed out in %d sec...\n",tv.tv_sec);
          break;
      }
      if (consock != INVALID_SOCKET)
      {
          printf("\nClient connected...\n");
          break;
      }
     Sleep(1000);
  }

  ioctlsocket(sockid, FIONBIO, &off_sock);
  closesocket(sockid);
  WSACleanup();

  return 0;
}
398
31 июля 2008 года
Alexandoros
630 / / 21.10.2005
Цитата: 4nob1oz
Че по делу посказать трудно чтоли =\ Я и так знаю функции и какие сокеты есть.


А что ж у тебя ioctlsocket(sockid, FIONBIO,&on_sock); не было в вопросе, если и так знаеш?
ДОКУ ЧИТАЙ!!

Код:
int i = 0, PAUSE = 200;

while (1)
  {
       if( (consock = accept(sockid, (struct sockaddr *)&idsin, &i)) == INVALID_SOCKET)
       {
            if(WSAGetLastError != WSAEWOULDBLOCK)
                 break; // socket error      
             Sleep(PAUSE);
             ++i;
            if( i  / (1000/PAUSE) >= 5)
            {
                printf("time out..\r\n");
               break;
            }
         }
         
        // получили конект
        ...
        break;
  }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог