Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Socket C++ <=> Java 
V
    Опции темы
Temdegon
Дата 23.10.2010, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть windows-приложение, с которым мне нужно общаться из джава. Каких-то встроенных возможностей для коммуникации в нем не предусмотрено, но есть возможность загуржать пользовательскую dll, чем я и воспользовался. Написал свою dll на c++ и из нее коннекчусь к своему java-серверу. В сях я нуб, по этому сильно не заморачивался, нашел готовую реализацию сокета
http://www.adp-gmbh.ch/win/misc/sockets.html
и вроде пока все получается. Строки передаются и принимаются без проблем. Но одними строками сыт не будешь. Мне надо из этой dll в джава передать вот такую структуру:
Код

struct holdem_player{
    char            m_name[16]          ;    
    double          m_balance           ;    
    double          m_currentbet        ;    
    unsigned char   m_cards[2]          ;    
    unsigned char   m_name_known    : 1 ;
    unsigned char   m_balance_known : 1 ;
    unsigned char   m_fillerbits    : 6 ;    
    unsigned char   m_fillerbyte        ;
};

struct holdem_state{
    char            m_title[64]         ;    
    double          m_pot[10]           ;    
    unsigned char   m_cards[5]          ;    
    unsigned char   m_is_playing    : 1 ;    
    unsigned char   m_is_posting    : 1 ;    
    unsigned char   m_fillerbits    : 6 ;    
    unsigned char   m_fillerbyte        ;    
    unsigned char   m_dealer_chair      ;    
    holdem_player   m_player[10]        ;    
};


Как это правильнее (и просто, если это применимо к си smile ) сделать?
Еще меня настораживает один момент. Как-то странно выглядит функция для отправки байтов:

Код

// метод отправки строки, работает
void Socket::SendLine(std::string s) {
  s += '\n';
  send(s_,s.c_str(),s.length(),0);
}
// вроде для отправки байт, но опчему-то обьявлен как string, и не особо отличается от SendLine
// это нормально?
void Socket::SendBytes(const std::string& s) {
  send(s_,s.c_str(),s.length(),0);
}


Как мне отправлять такие данные в в этот метод, и как их потом использовать в джава?
PM MAIL   Вверх
EgorTheBlade
Дата 23.10.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Никогда до етого такую функцию не видел в С++ для отправки байт.
Переконвертируте ваши данные в байты в ручную или исп http://stackoverflow.com/questions/105252/...ian-values-in-c.
PM MAIL Skype   Вверх
COVD
Дата 23.10.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Цитата

Как-то странно выглядит 

Это и есть одна из причин появления на свет Java.

Цитата

как их потом использовать в джава

Читайте по-байтно и укладывайте в ByteBuffer. А потом извлекайте из ByteBuffer примитивные java-аналоги методами типа getDouble(), get() (для byte).... Для правильной интерпретации целочисленных типов int, long возможно надо установить в ByteBuffer порядок байтов ByteOrder.LITTLE_ENDIAN. 
PM MAIL   Вверх
Temdegon
Дата 24.10.2010, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо. Подозревал, что так и придется делать, но решил спросить на всякий случай. Думал, может через json передавать данные. Но я так понял, там возни будет не меньше. 
PM MAIL   Вверх
kosmonaFFFt
Дата 25.10.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно через XML, на Java оно очень просто парсится...


--------------------
user posted image
PM MAIL ICQ   Вверх
casey
Дата 31.10.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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





Код

void Socket::SendBytes(const std::string& s) {
  send(s_,s.c_str(),s.length(),0);
}


Функция будет некорректно работать в случае нахождения в последовательности байт к отправке байта 0х00  - проверил на VC++ 2008. Да тут и так ясно что так не следует делать - нужно переписать типа так:

Код

void Socket::SendBytes(const char *bytebuffer,int lengthofbuffer) {
  send(s_,bytebuffer,lengthofbuffer,0);
}





PM MAIL WWW   Вверх
Amp
Дата 1.11.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(casey @  31.10.2010,  17:14 Найти цитируемый пост)
Функция будет некорректно работать в случае нахождения в последовательности байт к отправке байта 0х00  - проверил на VC++ 2008

Каким же образом ты это проверил?
PM MAIL   Вверх
casey
Дата 1.11.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include "stdafx.h"
#include <string>


using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string str;
str = "iii\0jjj";
cout << str << "\n";
cout << str.length() << "\n";
str+="\0rrr";
cout << str << "\n";
cout << str.length() << "\n";

    return 0;
}


Так устроит?

Результат соответственно:

Код

iii
3
iii
3


Это сообщение отредактировал(а) casey - 1.11.2010, 12:26
PM MAIL WWW   Вверх
Amp
Дата 1.11.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А причем здесь обсуждаемая функция? smile Вся загвоздка в инициализации строки, которая в нее передается. Если хочется положить туда некие нестроковые данные, то не надо явно или косвенно вызывать методы, которые повязаны на null-terminated логике.

Код

char buffer[] = {"iii\0jjj"};
std::string str(buffer, sizeof(buffer));

std::cout << str.length() << std::endl;


Либо так
Код

str.resize(sizeof(buffer));
memcpy((void *)(str.c_str()), buffer, sizeof(buffer));


Добавлено через 2 минуты и 50 секунд
Конечно в описываемом случае работа со строкой является некрасивым решением.
PM MAIL   Вверх
casey
Дата 1.11.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

char buffer[] = {"iii\0jjj"};
std::string str(buffer, sizeof(buffer));

std::cout << str.length() << std::endl;


Согласен, не знал что так можно обойти


Код

str.resize(sizeof(buffer));
memcpy((void *)(str.c_str()), buffer, sizeof(buffer));


Так по идее нельзя, потому как
const char* c_str()
Вобщем-то это костыль, который не обязан везде работать
PM MAIL WWW   Вверх
Amp
Дата 1.11.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(casey @  1.11.2010,  15:58 Найти цитируемый пост)
const char* c_str()
Вобщем-то это костыль, который не обязан везде работать 

Да вся эта история со string по сути костыль.
PM MAIL   Вверх
Temdegon
Дата 2.11.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я поступил самым примитивным способом - сбросил все данные в строку через разделитель.
Всем спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




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


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

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