Sockets вопрос

uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Sockets вопрос

Post by uniqueman »

Система клиент - сервер. Работа через асинхронные сокеты.

После установления соединения с сервером клиент делает два следующих вызова:

SendInfo ("test1");
SendInfo ("test2");

SendInfo на клиенте просто посылает параметр в качестве команды серверу

void SendInfo (string& sCommand)
{
pSocket - > Send (sCommand);
}

На каждую команду сервер должен прислать ответ. Код упрощен, но смысл надеюсь ясен. Так вот если последовательность команд именно такая, то ответ приходит на выполнение команды test2 (!). На test1 не приходит. И я смотрю на дебаге в функции Send сокетовой и вижу что сразу идет test2.

Если же законментировать вторую команду, то приходит ответ на выполнение первой.

Если же посылать только первую команду, дождатся ответа от сервера, обработать ответ а потом послать вторую команду, то все в порядке.

Почему так может происходить?
User avatar
Митяй
Уже с Приветом
Posts: 10000
Joined: 16 Jul 2003 18:47
Location: CA->AZ->DE->NJ-> AZ->GA->AZ

Re: Sockets вопрос

Post by Митяй »

uniqueman wrote:Система клиент - сервер. Работа через асинхронные сокеты.

После установления соединения с сервером клиент делает два следующих вызова:

SendInfo ("test1");
SendInfo ("test2");

SendInfo на клиенте просто посылает параметр в качестве команды серверу

void SendInfo (string& sCommand)
{
pSocket - > Send (sCommand);
}

На каждую команду сервер должен прислать ответ. Код упрощен, но смысл надеюсь ясен. Так вот если последовательность команд именно такая, то ответ приходит на выполнение команды test2 (!). На test1 не приходит. И я смотрю на дебаге в функции Send сокетовой и вижу что сразу идет test2.

Если же законментировать вторую команду, то приходит ответ на выполнение первой.

Если же посылать только первую команду, дождатся ответа от сервера, обработать ответ а потом послать вторую команду, то все в порядке.

Почему так может происходить?


Оптимизация выключена ? Компилятор не глючит, местами не переставляет ?
А пристыдишь их - и сальцо найдется, и горилочка...
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Re: Sockets вопрос

Post by uniqueman »

Оптимизация выключена ?


поподробнее можно плиз

Компилятор не глючит, местами не переставляет ?


даже если переставлял бы, то приходил бы ответ на обе команды. а так только на одну
Hamster
Уже с Приветом
Posts: 11475
Joined: 20 Nov 2000 10:01
Location: Escondido, CA

Post by Hamster »

Надо смотреть код, в котором читаются данные из сокета на сервере.
DmitryMA
Уже с Приветом
Posts: 783
Joined: 20 May 2002 00:52
Location: Israel-->Boston, USA

Post by DmitryMA »

\n в конец строки добавить не пробовали?
Демократия измеряется расстоянием, которое может пройти гражданин без предъявления удостоверения личности.
User avatar
Митяй
Уже с Приветом
Posts: 10000
Joined: 16 Jul 2003 18:47
Location: CA->AZ->DE->NJ-> AZ->GA->AZ

Re: Sockets вопрос

Post by Митяй »

uniqueman wrote:
Оптимизация выключена ?


поподробнее можно плиз

Компилятор не глючит, местами не переставляет ?


даже если переставлял бы, то приходил бы ответ на обе команды. а так только на одну


Какая ОС ? Тестовый пример тоже не помешает.
А пристыдишь их - и сальцо найдется, и горилочка...
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

DmitryMA wrote:\n в конец строки добавить не пробовали?

Ну или как вариант, явно вызывать Flush...
I hated LA
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Re: Sockets вопрос

Post by uniqueman »

Какая ОС ? Тестовый пример тоже не помешает.


система 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 я вижу ответ только на первую команду :umnik1: Извиняюсь за ошибку в первоначальном посте. ОТВЕТ ПРИХОДИТ НА ПЕРВУЮ КОМАНДУ, запрос на который посылается в OnConnect (). На вторую команду ответа не приходит.

Если надо то поясню еще .. спрашивайте

спасибо
SlaMin
Уже с Приветом
Posts: 176
Joined: 21 Feb 2002 10:01
Location: KZ -> KY -> WA

Post by SlaMin »

Вызов GetData происходит до того как соединение установлено, поэтому сервер скорее всего не получает команду. Если Вы поставите точки останова в

string sCommand = "call first command"

и

string sCommand = "call second command"

То вторая должна сработать раньше.
Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Re: Sockets вопрос

Post by Don Cherry »

uniqueman wrote:Система клиент - сервер. Работа через асинхронные сокеты.

После установления соединения с сервером клиент делает два следующих вызова:

SendInfo ("test1");
SendInfo ("test2");

SendInfo на клиенте просто посылает параметр в качестве команды серверу

void SendInfo (string& sCommand)
{
pSocket - > Send (sCommand);
}

На каждую команду сервер должен прислать ответ. Код упрощен, но смысл надеюсь ясен. Так вот если последовательность команд именно такая, то ответ приходит на выполнение команды test2 (!). На test1 не приходит. И я смотрю на дебаге в функции Send сокетовой и вижу что сразу идет test2.

Если же законментировать вторую команду, то приходит ответ на выполнение первой.

Если же посылать только первую команду, дождатся ответа от сервера, обработать ответ а потом послать вторую команду, то все в порядке.

Почему так может происходить?


На сколько я знаю - так работает socket, если во время выполнения первого запроса пришел второй, то первый прерывается и обрабатывается второй.
Житейский пример:
http in Internet browser.
Вызвали html страницу, пока она грузится вызвали другую, первая уже не приходит, только вторая.
User avatar
Vlad G
Уже с Приветом
Posts: 596
Joined: 20 Jan 2002 10:01
Location: Israel

Post by Vlad G »

Посмотри, что возвращают pSocket - > Send.
Проверь, а получает ли клиент оба покета.

Return to “Вопросы и новости IT”