Ok. sorry voor :
* de wat trage reactie, maar ik zit in Nieuw Zeeland, en de tijd loopt daar net iets anders
* het vern**ken van de layout
clientside:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| //SEND 1000 coordinate structs ----------------------------------
while (count++ < total)
{
buffer[0] = CAMERA_COORDINATES_PACKET;
* (Body2d *)&buffer[1] = b;
try
{// Send the string to the echo server
sock.send(buffer, bodysize);
//cout << "res: " << res << "\n";
memset(szResult,0,sizeof(szResult));
res = sock.recv(szResult, sizeof(szResult)-1);
if (res != SOCKET_ERROR)
{
if (res!=0)
{
printf("The server said (%d): %s ", res, szResult);
}
res = WSAGetLastError();
}
}
catch (SocketException &e)
{
cout << "exception\n";
}
} |
serverside:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| s = select(nfds,&input_set,NULL,&exc_set,&timeout); // The Actual Select Function sees if data coming in and stores it in s
if (s > 0) // Is there data coming in?
{
for (int i=0; i<MAX_CONNECTIONS; i++)
{
if (clients[i].inUse)
{
if (FD_ISSET(clients[i].socket, &input_set)) // Actual Data coming through?
{
// Get whatever message the client sending, and carry out appropriate response
int res = clients[i].getMessage();
if ((res == SOCKET_ERROR) || (res == 0))
disconnect(clients[i]);
}
}
}
} |
Waarbij getMessage() ongeveer er zo uit ziet:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| int ClientHandler::getMessage()
{
// Recieve The Data and Put into a Buffer Until we know what it is.
char buffer[MAX_MSG_LENGTH];
memset(buffer,0, MAX_MSG_LENGTH);
int res = recv(socket,buffer,MAX_MSG_LENGTH,0);
if (res == SOCKET_ERROR || res==0)
{
return res;
}
if (strlen(buffer) == 0)
return 1;
/*
else
printf("Message from %s: %s", ip.c_str(),buffer);*/
if (clientType == UNKNOWN_CLIENT) {if (!parseHello(buffer, res)) return 0;}
else if (clientType == CAMERA_CLIENT) parseCameraMsg(buffer, res);
else if (clientType == DISPLAY_CLIENT) parseDisplayMsg(buffer, res);
else if (clientType == ECHO_CLIENT) parseEchoMsg(buffer, res);
else
{
//we should never get here!
return 0;
}
return res;
} |
extra toelichting:
Er kunnen camera-clients inloggen bij de server en hun informatie (een set van 2d punten) opsturen, de server stuurt een ok-berichtje terug
Er kunnen ook display clients inloggen, die sturen een REQ en krijgen een set 3D punten terug
De server berekent de 3d locatie van de door de 2+ camera's aangeleverde punten
Ik voer deze test eerst lokaal uit (alles op 1 PC) en daarna met een andere PC via een switch, maar het maakt geen verschil in tijd. Ik vermoed dus een restrictie in de drivers/hardware/winsock implementatie?
nog meer info:
Ik heb ook geprobeert gewoon niks terug te sturen vanuit de server naar de client. In dat geval kan ik de messages sneller versturen (+- 256 per seconde) maar dan komen ze niet allemaal aan (? raar ja inderdaad)
De toepassing moet "real-time" zijn -> als er een verandering in de camera-kant plaatsvind, moet dat binnen +- 10 ms aan de beeldkant bekend zijn, zodat er geen lag optreed (dus net zo snel als een TFT refresh rate zonder ghosting effect :-))
[
Voor 30% gewijzigd door
Verwijderd op 10-10-2003 06:51
]