LINUX.ORG.RU

xinetd && C++ && socket


0

0

Здраствуйте!

Есть сервер на ++ пускаемый по xinetd.
Текст сервера :
------------------------------
string str;
cin >> str;
if ( str == "test_start" )
int rez;
cout << "test_ok" << endl;
------------------------------

конекчусь netacat'ом посылаю test_start приходит test_ok.

клиент(С-шный) же застревает на получении(сокеты блокирующие).
--------------------------------------------------
int status = recv ( m_sock, buf, MAXRECV, 0 );
--------------------------------------------------

В чем может быть проблема?

Спасибо.
★★★

>В чем может быть проблема?

например в том что ты ему не послал "test_start"

cvv ★★★★★
()

Посмотри, может сервер висит на "cin >> str"
Если это так, то что пишет клиент в сокет?
Как сервер узнаЁт, что от клиента пришли ВСЕ данные?

Вообще-то, если клиент однократно запрашивает сервер, читает ответ
и завершается, то после отправки данных можно просто сделать

shutdown (m_sock, SHUT_WR);

romanSA
()
Ответ на: комментарий от cvv

Короче нашел косяк : клиент отсылает данные а сервер ждет получения, как только клиент умирает(у меня стоит таймаут три секунды на ожидание select'ом у клиента) так вот как только клиент умирает сервер получает эту строку, короче нужно сделать что то вроде flush для сокетов... вот только как?

fura13 ★★★
() автор топика
Ответ на: комментарий от romanSA

угум, сервер висит на cin>>str ... потому что клиент якобы не отослал данные, хотя он уже сделал send и весит в select'e перед recv'ом. В чем может быть косяк? Почему данные приходят только после завершения клиента?

fura13 ★★★
() автор топика
Ответ на: комментарий от fura13

Потому что сокет на стороне сервера буферизирует данные.
Если в коде C++ потока стоит скажем
read (buff, 512);
то пока из сокета не прочитается 512 байт или не будет разорвано
cоединение, вполне возможно возврата из read() и не будет.
Если у тебя клиент один раз посылает данные на сервер, то как я писал
можно использовать после отсылки данных вызов:
shutdown (m_sock, SHUT_WR);
В этом случае std::cin будет считать, что достиг "конца файла" и вернет данные в строку.
В противном случае нужно определять протокол взаимодействия сервера и клиента (и как следствие не использовать cin и прочее)

romanSA
()
Ответ на: комментарий от Anoxemian

Можно поинтересоваться что такое "нулевой бит"?

romanSA
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.