Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2012, 23:13   #1
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию socket timeout

Ставлю сокету таймаут на чтение, таймаут работает, но на 0,5 секунды длинне чем просил. с одной стороны, не сильно критично, с другой стороны, какого х?

для наблюдения эффекта написал такое:
Код:
#include <WinSock2.h>
#include <ws2tcpip.h>

#include <Windows.h>

#include <iostream>


using namespace std;


int wmain(int argc, wchar_t ** argv) {
	int result(0), optVal(1), optSize(4);
	sockaddr_in sockAss = {0};
	char sbuf[512] = {0};
	WSADATA wsaData = {0};

	result = WSAStartup(0x202, &wsaData);
	if (!result) {
		SOCKET socket = WSASocket(AF_INET, SOCK_DGRAM, 0, 0, 0, WSA_FLAG_OVERLAPPED);

		if (socket == INVALID_SOCKET) {
			result = WSAGetLastError();
		} else {
			setsockopt(socket, IPPROTO_UDP, UDP_CHECKSUM_COVERAGE, (char *)&optVal, optSize);
			setsockopt(socket, SOL_SOCKET, SO_BROADCAST, (char *)&optVal, optSize);
			setsockopt(socket, IPPROTO_IP, IP_RECEIVE_BROADCAST, (char *)&optVal, optSize);

			optVal = 150;
			setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&optVal, sizeof(int));

			sockAss.sin_addr.S_un.S_addr = htonl(INADDR_LOOPBACK);
			sockAss.sin_port = 0;
			sockAss.sin_family = AF_INET;

			if (SOCKET_ERROR != bind(socket, (sockaddr *)&sockAss, sizeof(sockaddr_in))) {
				optVal = GetTickCount();

				cout << "socket timeout in ms.." << endl;

				for (int i(0);i<10;i++) {
					result = optVal;

					optSize = sizeof(sockaddr_in);
					recvfrom(socket, sbuf, 512, 0, (sockaddr *)&sockAss, &optSize);
					
					optVal = GetTickCount();
					cout << optVal - result << endl;
				}

				result = 0;
			} else {
				result = WSAGetLastError();

			}

			closesocket(socket);
		}

		WSACleanup();
	}

	cout << "result: " << result << endl;

	system("pause");
	
	return result;
}
откуда эти полсекунды? что не так?
f.hump вне форума Ответить с цитированием
Старый 30.10.2012, 09:16   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

http://blogs.msdn.com/b/oldnewthing/...02/459952.aspx
waleri вне форума Ответить с цитированием
Старый 30.10.2012, 11:19   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2waleri каким местом вот та фиигня относится к теме вопроса мне не понятно. я конечно догадываюсь, что большинство глобальных переменных в винде обновляется раз 15-20 мс, но получение 500 адитивых мс - это немного другое число, плюс, повторяю величина является адитивным смещением.
f.hump вне форума Ответить с цитированием
Старый 30.10.2012, 15:36   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А вы поексперементируйте с различными таймаутами
waleri вне форума Ответить с цитированием
Старый 30.10.2012, 15:48   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а думаете, как я догадался, что величина адитивная? - экспериментировал с разными таймаутами.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Connect timeout ramzes777 Работа с сетью в Delphi 3 10.10.2014 10:26
Connect по timeout Tahoma Win Api 8 26.07.2012 09:17
Timeout палит скрипт stdio Свободное общение 0 16.02.2012 22:33
Если Connect timeout, то... ramzes777 Работа с сетью в Delphi 3 11.11.2011 16:36
ClientSocket и TimeOut Powerfull100 Работа с сетью в Delphi 0 22.10.2009 12:29