Bir C/C++ istemci/sunucu soketi uygulaması programlıyorum. Bu noktada, istemci kendisini her 50 ms'de bir sunucuya bağlar ve bir mesaj gönderir.C yuva istemci/sunucu gecikmesi
birisini Has ... Aniden, sunucu şey daha ve bir kerede daha sonra 5 mesajlar ... Ve bazen her şey çalışıyor aldığında değildir:
Herşey eserleri gibi görünüyor, ama veri akışı sürekli değildir Bu garip davranışın kökeni hakkında bir fikir?
kod kısmı:
Müşteri:
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();
}
}
Sunucu:
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);
}
}
Düzenlemeler: Denedim 1. yapmak
int flag = 1;
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof flag);
Hem istemcide hem de sunucuda, ancak sorun hala var.
2.Yes bu bağlantıların/deconnections çok inneficient, ama ben çalıştığınızda Nihayet
... Sonra mesajı sadece bir kez gönderilir
socket = new socket();
while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket->write("blah");
message.clear();
message = socket->read();
time=SDL_GetTicks();
}
}
yazma (veya gelen) için:
TCP_NODELAY'i sunucu tarafındaki istemci soketine takmayı unutmuştum. Şimdi mükemmel çalışıyor! İşlemleri iş parçacığı içerisine sokup soketlerin açık kalmasını sağlarım. Teşekkür ederiz tüm :)
Burada insanların bilgisi her zaman hayranlık duyuyorum. Çok teşekkür ederim. Bunu bir süre içinde deneyeceğim :) – Klaus
+1 İlgili kavrama işaret etmek için. –
Yukarıdaki cevabımı görün. – Klaus