Ich programmiere eine C/C++ - Client/Server-Sockets-Anwendung. An diesem Punkt verbindet sich der Client alle 50ms mit dem Server und sendet eine Nachricht.C Sockets Client/Server Verzögerung
Alles scheint funktioniert, aber der Datenfluss ist nicht kontinuierlich: Plötzlich wird der Server nichts mehr empfängt, und dann 5 Nachrichten auf einmal ... Und manchmal alles funktioniert ...
Hat jemand eine Vorstellung von der Herkunft dieses seltsamen Verhaltens?
Ein Teil des Codes:
Auftraggeber:
while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket = new socket();
socket->write("blah");
message.clear();
message = socket->read();
socket->close();
delete socket;
time=SDL_GetTicks();
}
}
Server:
while (true) {
fd_set readfs;
struct timeval timeout={0,0};
FD_ZERO(&readfs);
FD_SET(sock, &readfs);
select(sock + 1, &readfs, NULL, NULL, &timeout)
if(FD_ISSET(sock, &readfs))
{
SOCKADDR_IN csin;
socklen_t crecsize = sizeof csin;
SOCKET csock = accept(sock, (SOCKADDR *) &csin, &crecsize);
sock_err = send(csock, buffer, 32, 0);
closesocket(csock);
}
}
Edits: 1. Ich habe versucht,
int flag = 1;
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof flag);
zu tun In Client und Server, aber das Problem ist immer noch da.
2.Yes diese Verbindungen/deconnections sind sehr inneficient, aber wenn ich versuche
socket = new socket();
while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket->write("blah");
message.clear();
message = socket->read();
time=SDL_GetTicks();
}
}
schreiben Dann wird die Nachricht nur einmal gesendet (oder empfangen) ...
Endlich:
Ich hatte vergessen, TCP_NODELAY auf den Client-Socket auf der Serverseite anzuwenden. Jetzt funktioniert es perfekt! Ich setze die Prozesse in Threads, damit die Sockets offen bleiben. Vielen Dank alle :)
Ich bin immer fasziniert von dem Wissen der Menschen hier. Vielen Dank. Ich werde das in einer Weile versuchen :) – Klaus
+1 für auf das Konzept beteiligt zeigen. –
Siehe meine Antwort oben. – Klaus