Система клиент - сервер. Работа через асинхронные сокеты.
После установления соединения с сервером клиент делает два следующих вызова:
SendInfo ("test1");
SendInfo ("test2");
SendInfo на клиенте просто посылает параметр в качестве команды серверу
void SendInfo (string& sCommand)
{
pSocket - > Send (sCommand);
}
На каждую команду сервер должен прислать ответ. Код упрощен, но смысл надеюсь ясен. Так вот если последовательность команд именно такая, то ответ приходит на выполнение команды test2 (!). На test1 не приходит. И я смотрю на дебаге в функции Send сокетовой и вижу что сразу идет test2.
Если же законментировать вторую команду, то приходит ответ на выполнение первой.
Если же посылать только первую команду, дождатся ответа от сервера, обработать ответ а потом послать вторую команду, то все в порядке.
Почему так может происходить?
Sockets вопрос
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
-
- Уже с Приветом
- Posts: 10000
- Joined: 16 Jul 2003 18:47
- Location: CA->AZ->DE->NJ-> AZ->GA->AZ
Re: Sockets вопрос
uniqueman wrote:Система клиент - сервер. Работа через асинхронные сокеты.
После установления соединения с сервером клиент делает два следующих вызова:
SendInfo ("test1");
SendInfo ("test2");
SendInfo на клиенте просто посылает параметр в качестве команды серверу
void SendInfo (string& sCommand)
{
pSocket - > Send (sCommand);
}
На каждую команду сервер должен прислать ответ. Код упрощен, но смысл надеюсь ясен. Так вот если последовательность команд именно такая, то ответ приходит на выполнение команды test2 (!). На test1 не приходит. И я смотрю на дебаге в функции Send сокетовой и вижу что сразу идет test2.
Если же законментировать вторую команду, то приходит ответ на выполнение первой.
Если же посылать только первую команду, дождатся ответа от сервера, обработать ответ а потом послать вторую команду, то все в порядке.
Почему так может происходить?
Оптимизация выключена ? Компилятор не глючит, местами не переставляет ?
А пристыдишь их - и сальцо найдется, и горилочка...
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
Re: Sockets вопрос
Оптимизация выключена ?
поподробнее можно плиз
Компилятор не глючит, местами не переставляет ?
даже если переставлял бы, то приходил бы ответ на обе команды. а так только на одну
-
- Уже с Приветом
- Posts: 11475
- Joined: 20 Nov 2000 10:01
- Location: Escondido, CA
-
- Уже с Приветом
- Posts: 783
- Joined: 20 May 2002 00:52
- Location: Israel-->Boston, USA
-
- Уже с Приветом
- Posts: 10000
- Joined: 16 Jul 2003 18:47
- Location: CA->AZ->DE->NJ-> AZ->GA->AZ
Re: Sockets вопрос
uniqueman wrote:Оптимизация выключена ?
поподробнее можно плизКомпилятор не глючит, местами не переставляет ?
даже если переставлял бы, то приходил бы ответ на обе команды. а так только на одну
Какая ОС ? Тестовый пример тоже не помешает.
А пристыдишь их - и сальцо найдется, и горилочка...
-
- Уже с Приветом
- Posts: 3982
- Joined: 13 Jul 2000 09:01
- Location: SVX -> BOS -> BUR -> SJC
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
Re: Sockets вопрос
Какая ОС ? Тестовый пример тоже не помешает.
система 2000 Про.
Вот как все происходит.
в обработчике OnInitDialog создается объект класса pClient.
OnInitDialog ()
{
pClient = new Client ();
if (pClient)
pClient -> InitConnection ();
if (pClient)
pClient -> GetData();
}
Класс Client это класс который отвечает за создание сокета и последующую работу с этим сокетом. Сокет создается асинхронный. Потом инициируется соединение через InitConnection и затем вызывается функция которая посылает вторую (!!!!) команду.. первая команда посылается щас покажу как..
В функции InitConnection класса Client происходит вызов connect для созданного сокета.
void Client::InitConnection ()
{
connect (hSocket, .......);
}
в обработчике OnConnect класса Client (сокет асинхронный, поэтому обрабатваем сообщения различные сокетовые) происходит как раз посылка первой команды
void Client :: OnConnect ()
{
string sCommand = "call first command"
SendInfo (sCommand);
}
void Client:: GetData()
{
string sCommand = "call second command"
SendInfo (sCommand")
}
в обработчике OnRead класса Client я вижу ответ только на первую команду Извиняюсь за ошибку в первоначальном посте. ОТВЕТ ПРИХОДИТ НА ПЕРВУЮ КОМАНДУ, запрос на который посылается в OnConnect (). На вторую команду ответа не приходит.
Если надо то поясню еще .. спрашивайте
спасибо
-
- Уже с Приветом
- Posts: 176
- Joined: 21 Feb 2002 10:01
- Location: KZ -> KY -> WA
-
- Уже с Приветом
- Posts: 166
- Joined: 13 Oct 2003 20:11
- Location: Canada
Re: Sockets вопрос
uniqueman wrote:Система клиент - сервер. Работа через асинхронные сокеты.
После установления соединения с сервером клиент делает два следующих вызова:
SendInfo ("test1");
SendInfo ("test2");
SendInfo на клиенте просто посылает параметр в качестве команды серверу
void SendInfo (string& sCommand)
{
pSocket - > Send (sCommand);
}
На каждую команду сервер должен прислать ответ. Код упрощен, но смысл надеюсь ясен. Так вот если последовательность команд именно такая, то ответ приходит на выполнение команды test2 (!). На test1 не приходит. И я смотрю на дебаге в функции Send сокетовой и вижу что сразу идет test2.
Если же законментировать вторую команду, то приходит ответ на выполнение первой.
Если же посылать только первую команду, дождатся ответа от сервера, обработать ответ а потом послать вторую команду, то все в порядке.
Почему так может происходить?
На сколько я знаю - так работает socket, если во время выполнения первого запроса пришел второй, то первый прерывается и обрабатывается второй.
Житейский пример:
http in Internet browser.
Вызвали html страницу, пока она грузится вызвали другую, первая уже не приходит, только вторая.
-
- Уже с Приветом
- Posts: 596
- Joined: 20 Jan 2002 10:01
- Location: Israel