Я программирую приложение клиент / серверные сокеты на C / C ++.В этот момент клиент подключается к серверу каждые 50 мс и отправляет сообщение.
Кажется, все работает, но поток данных не непрерывен: вдруг сервер больше ничего не получает, а затем5 сообщений одновременно ... А иногда все работает ...
Кто-нибудь имеет представление о происхождении этого странного поведения?
Некоторая часть кода:
Клиент:
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();
}
}
Сервер:
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);
}
}
Изменения: 1.Я пытался сделать
int flag = 1;
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof flag);
На клиенте и сервере, но проблема все еще существует.
2. Да, эти соединения / разъединения очень неэффективны, но когда я пытаюсь написать
socket = new socket();
while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket->write("blah");
message.clear();
message = socket->read();
time=SDL_GetTicks();
}
}
Тогда сообщение отправляется только один раз (или получено) ...
Наконец:
Я забыл подать заявкуTCP_NODELAY к клиентскому сокету на стороне сервера.Теперь это работает отлично!Я поместил процессы в потоки, чтобы сокеты оставались открытыми.Спасибо всем :) 1033 *