Ik ben bezig met een server die 'interactief' commandos afwerkt, die ontvangen worden van clients.
Het werkt interactief als in: op input volgt een reactie, waar de client op wacht.
Nu worden sommige reacties van de server niet verzonden (mogelijk is het TCP send window nog niet vol?), waardoor de client na een tijdje een timeout geeft (volgens spec, kan namelijk ook een echte timeout zijn), terwijl de server de reactie dus wel heeft 'verzonden' naar de socket.
Wat doe ik hieraan? Om met dit protocol te kunnen werken, moet ik er natuurlijk zeker van zijn dat de reactie gewoon verzonden wordt.
De enige manier die ik nu zie om dit op te lossen is het toevoegen van enkele karakters aan de reactie van de server, aangezien het lijkt alsof er dan een of andere drempelwaarde wordt overschreden (mogelijk is dit het TCP send window).
bovenstaande functie krijgt alle data als input, en ik krijg geen melding van een pauze, dus de data kan direct weg naar het OS.
Het werkt interactief als in: op input volgt een reactie, waar de client op wacht.
Nu worden sommige reacties van de server niet verzonden (mogelijk is het TCP send window nog niet vol?), waardoor de client na een tijdje een timeout geeft (volgens spec, kan namelijk ook een echte timeout zijn), terwijl de server de reactie dus wel heeft 'verzonden' naar de socket.
Wat doe ik hieraan? Om met dit protocol te kunnen werken, moet ik er natuurlijk zeker van zijn dat de reactie gewoon verzonden wordt.
De enige manier die ik nu zie om dit op te lossen is het toevoegen van enkele karakters aan de reactie van de server, aangezien het lijkt alsof er dan een of andere drempelwaarde wordt overschreden (mogelijk is dit het TCP send window).
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
29
30
31
32
33
34
35
36
37
| void SocketStream::write(const void *pBuffer, int nBytes) { if(fd == -1) THROW_EXCEPTION(IOException, InvalidFileDescriptor) const char *buffer = (char *)pBuffer; int nToSend = nBytes; while(nToSend > 0) { int sent = Socket::write(fd, buffer, nToSend); if(sent == -1) { bCanWrite = false; THROW_EXCEPTION(IOException, OSFileWriteError) } nToSend -= sent; buffer += sent; if(nToSend > 0) { // We need to wait before we can send again (10 sec by default) struct timeval timeout; fd_set out; FD_ZERO(&out); FD_SET(fd, &out); printf("Cannot send yet, waiting 10 secs...\n"); timeout.tv_sec = 10000 / 1000; timeout.tv_usec = (10000 % 1000) * 1000; if(::select(1, 0, &out, 0, &timeout) == -1 && errno != EINTR) THROW_EXCEPTION(IOException, OSFileWriteError) } } } |
bovenstaande functie krijgt alle data als input, en ik krijg geen melding van een pauze, dus de data kan direct weg naar het OS.