Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с сокетами 
:(
    Опции темы
AndreyK
Дата 25.2.2013, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Я тут переписываю C++ клиент под андроид.
И вот соединение через сокеты происходит как-то криво, а при отладке вообще беда:

На стороне Android клиента код:
Код

  Socket sock = new Socket(serveraddress,portnumber);

Ожидает открытия сокета но управление не возвращает.
Но cpp сервер уже открыл соединение создал этот сокет после чего дошел до ожидания поступления данных:
Код

dwRead = recv(sock,buffer,POKET_SIZE,0);

И начинает ожидать ввода данных.
А данные то не поступают, потому-что java клиент все еще висит на стадии открытия сокета.

И здесь две проги висят во взаимном затыке.

И только когда cpp сервер по таймауту прекращает ожидание и закрывает сокет 
Код

closesocket(sock);

, java ,как ни в чем не бывало, начинает выполнять код.
Сокет возвращается нормальный, в него нормально подаются данные, а то, что он давно закрыт обнаруживается только на стадии чтения ответа от сервера (возникает исключение "broken pipe")

Что тут можно сделать?
Может я что-то неправильно делаю?


Это сообщение отредактировал(а) AndreyK - 25.2.2013, 17:08
PM MAIL   Вверх
AndreyK
Дата 26.2.2013, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Похоже это все какой-то кумулятивный эффект от эмулятора плюс мелкие погрешности программы.
Увеличил все используемые таймауты до больших величин и ошибка исчезла.
Поэтому в дебагере и не работало - там надо всегда на все infinity выставлять.
Даже не знаю какой из таймаутов оказался критичным - повторить эффект больше не удалось.

PM MAIL   Вверх
AndreyK
Дата 26.2.2013, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Еще добавлю, для тех, кто пишет сетевые утилиты java-cpp, что я еще узнал.
Нельзя в Сервере давать команды:
Код

shutdown(sock,SD_RESEIVE);
shutdown(sock,SD_SEND);
shutdown(sock,SD_BOTH);

Даже перед самым закрытием сокета.
Использовать только
Код

closesocket(sock);

и ничего больше.
Эти команды даются только при аварийном разрыве соединения.
Если windows проги нормально при этом (shutdown) завершают работу с сокетом, то java (а может это android? linux?) сразу прекращает читать из него данные.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0387 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.