Вот так выглядят тестовые программы:
Для передачи:
CODE
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
SOCKET sock;
struct sockaddr_in to;
char tx[] = "testtestestesttestestesttestestesttestestesttestes";
void CALLBACK SendPacket(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
sendto(sock, tx, 48, 0, (struct sockaddr*)&to, sizeof(struct sockaddr_in));
}
int _tmain(int argc, _TCHAR* argv[])
{
SetProcessAffinityMask(GetCurrentProcess(), 0x02);
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
WSADATA wd;
WSAStartup(MAKEWORD(2, 2), &wd);
sock = socket(AF_INET, SOCK_DGRAM, 0);
to.sin_family = PF_INET;
to.sin_addr.s_addr = INADDR_BROADCAST;
to.sin_port = htons(49501);
memset(&(to.sin_zero), 0, 8);
char on = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
UINT m_uResolution;
TIMECAPS tc;
timeGetDevCaps(&tc, sizeof(TIMECAPS));
m_uResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
timeBeginPeriod(m_uResolution);
MMRESULT m_idEvent = timeSetEvent(
10,
m_uResolution,
SendPacket,
NULL,
TIME_PERIODIC);
getchar();
return 0;
}
Для приема:
CODE
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define TOTAL_PACKETS 10000
double PCFreq = 0.0;
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double (li.QuadPart)/PCFreq;
}
int _tmain(int argc, _TCHAR* argv[])
{
SetProcessAffinityMask(GetCurrentProcess(), 0x01);
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
LARGE_INTEGER li;
QueryPerformanceFrequency(&li);
PCFreq = double(li.QuadPart)/1000.0;
WSADATA wd;
WSAStartup(MAKEWORD(2, 2), &wd);
SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in sa;
sa.sin_family = PF_INET;
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = htons(49501);
memset(&(sa.sin_zero), 0, 8);
bind(sock, (struct sockaddr*)&sa, sizeof(struct sockaddr));
int nbrcvd;
char buf[255];
double t0 = 0, t1 = 0, dt = 0;
int counter = 0;
unsigned __int32 tbl[100];
memset(tbl, 0, 400);
while (1)
{
nbrcvd = recv(sock, buf, sizeof(buf), 0);
if (nbrcvd > 0)
{
t1 = GetCounter();
if (t0 == 0)
t0 = t1;
else
{
dt = t1-t0;
t0 = t1;
//сбор статистики
nbrcvd = static_cast<int>((dt+0.1)/0.2);
tbl[nbrcvd]++;
}
counter++;
if (counter == TOTAL_PACKETS)
{
for (int i = 0; i<100; i++)
{
if (tbl[i] > 0)
fprintf(stdout, " %5.1f ms %5d %5.1f%% \n", (0.2*i), tbl[i], (double) (tbl[i]*100/TOTAL_PACKETS));
}
getchar();
return 0;
}
}
}
}
Такой результат на семерке, когда обе программы выполняются на одном компе:
CODE
8.8 ms 3 0.0%
9.0 ms 6 0.0%
9.2 ms 4 0.0%
9.4 ms 7 0.0%
9.6 ms 9 0.0%
9.8 ms 88 0.0%
10.0 ms 9746 97.0%
10.2 ms 110 1.0%
10.4 ms 11 0.0%
10.6 ms 7 0.0%
10.8 ms 4 0.0%
11.0 ms 1 0.0%
11.2 ms 3 0.0%
Цитата
Вообще, сочетания слов "Real time" и "Windows XP" в названии темы - это очень веселит ... я по-началу так и подумал, что это анекдот какой...
Самое смешное, что в системе вообще не будет машин с жестким реальным временем. В частности компьютер, которому предназначаются эти пакеты, работает под линуксом, без каких либо реал тайм расширений.