Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > TCP-передача структуры данных


Автор: gordmiand 27.8.2010, 20:12
Допустим есть структура
Код

struct Mystr
{
int pole1;
float pole2;
char  pole3;
} exz_struct;


exz_struct.pole1=11;
exz_struct.pole2=5.77;
exz_struct.pole3=”a”;

Подскажите пож-та программно smile  как мне наипростейшим способом из программы-сервера передать указанную выше структуру данных по TCP/IP – протоколу, а в программе-клиенте – принять эту информацию, вывести ее на экран и послать какой-либо ответ (например просто “1”) на сервер???
Почитал в Qt-книге  про класс QTcpSocket, но что-то я совсем в этих сетях заплутал…
помогите пож-та – очень буду благодарен…..

Автор: Abyx 27.8.2010, 20:57
socket() connect() send()
socket() bind() listen() accept() recv()

гуглите эти функции.

Автор: gordmiand 27.8.2010, 22:02
Abyx: дя я не только по гуглу смотрел эти функции, но и по книге, но все равно толком не разобрался - в сетях только-только начинаю делать первые шаги....накидайте хотя бы  приблизительный наипростейший примерчик для отсылки-приема указанной выше структуры данных - я буду очень обязан Вам...мне это в Qt надо сделать - я так понимаю с использованием класса QTcpSocket???

Автор: djamshud 27.8.2010, 22:07
http://www.hiraeth.com/alan/tutorials/tcpip/TCP-IP-complete.pdf

Вкратце. Но в идеале нужно читать Стивенса "Unix Network Programming". После этого можно писать хоть на Qt, хоть на дотнете.

Добавлено через 3 минуты и 47 секунд
К тому же, насколько я знаю, большая часть сетевой инфраструктуры винды была честно взята из FreeBSD. И комментарий Abyx , который виндузятник, это частично подтверждает: перечисленные им функции - часть POSIX и BSD.

Автор: gordmiand 27.8.2010, 22:22
djamshud: 
во-первых Ваша ссылка выдает "404 File not found"
во-вторых - мне надо под винду написать такой обмен, у меня есть такая рабочая программа, но под линуксом - в ней используются файлы sys/socket.h, sys/ioctl.h и arpa/inet.h, которых нет в винде…на какие виндовые файлы-аналоги мне можно заменить указанные выше файлы или как быть вообще? 

Автор: djamshud 27.8.2010, 22:25
http://www.hiraeth.com/alan/tutorials/tcpip/tcpip.html

Попробуйте эту. Там ссылка на pdf. Если не откроется, проблема в ваших интернетах.

>на какие виндовые файлы-аналоги мне можно заменить указанные выше файлы или как быть вообще?

Abyx перечислил вам названия функций, почему бы не обратиться к документации msdn?

Добавлено через 35 секунд
Но у вас вообще нет понимания сетей, поэтому нужно читать Стивенса.

Автор: Abyx 27.8.2010, 22:27
А вообще по хорошему надо использовать boost.asio .
Но вы его не осилите.

Автор: SVN74 27.8.2010, 22:34
Для Вас лучший вариант -  "Самоучитель игры на WINSOCK"
http://citforum.ru/book/cook/winsock.shtml

Автор: gordmiand 27.8.2010, 22:39
djamshud: у меня в линукс-проге тоже используются все функциии, перечисленные Abyx-ом выше - просто я не могу разобраться с этими 3 файлами из системной include-папки линукса...должны же быть их аналоги и в винде... 

Автор: djamshud 27.8.2010, 22:44
gordmiand, google: msdn connect -> http://msdn.microsoft.com/en-us/library/ms737625%28VS.85%29.aspx
Это документация. Там даже пример есть. Неужели так сложно?

Автор: gordmiand 27.8.2010, 22:49
djamshud  smile ...а сложно подправить имеющуюся у меня линукс-прогу под винды, учитывая, что в первой используются естес-но все теже функции connect, bind  и т.д.? вся загвоздка в этих 3 линукс-инклудниках smile .... 

Автор: djamshud 27.8.2010, 22:54
gordmiand, думайте.

Автор: gordmiand 27.8.2010, 23:01
 smile 
djamshud: а если я Вам покажу файлы проги - Вы сможете мне более предметно помочь? ведь знающему человеку это одна (две) минута smile ... 

Автор: Abyx 28.8.2010, 00:23
gordmiand, вам надо в центр помощи.

Автор: boostcoder 28.8.2010, 03:12
Цитата

А вообще по хорошему надо использовать boost.asio

ессно! это единственное перспективное направление.

вот. даже проверил smile 
Код

#include <boost/asio.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <iostream>
#include <fstream>

/***************************************************************************/

struct Mystr {
   int pole1;
   float pole2;
   char  pole3;
};

/***************************************************************************/

namespace boost { namespace serialization {

template<typename archive_t>
void serialize(archive_t& ar, Mystr& o, unsigned int) {
   ar & o.pole1
      & o.pole2
      & o.pole3;
}

} }

/***************************************************************************/

int main() {
using boost::asio::ip::tcp;

   const char* ip = "127.0.0.1";
   const char* port = "3400";
   
   Mystr str = {33, 3, '6'};
   try {
      std::stringstream ss;
      { boost::archive::binary_oarchive(ss) << str; }

      boost::asio::io_service ios;
      tcp::socket sock(ios);

      boost::system::error_code error = boost::asio::error::host_not_found;
      sock.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(ip), port), error);
      { (error) ? throw boost::system::system_error(error) : 0; }

      boost::asio::write(sock, boost::asio::buffer(ss.str()),
         boost::asio::transfer_all(), error
      );
   } catch (const boost::system::system_error& e) {
      std::cout << "(std::exception): " << e.what() << std::endl;
      return 1;
   }

   return 0;
}

/***************************************************************************/


Автор: Abyx 28.8.2010, 10:47
boostcoder, что-то кода у вас многовато. и сервера нет.

Автор: boostcoder 28.8.2010, 15:50
Цитата(Abyx @  28.8.2010,  10:47 Найти цитируемый пост)
что-то кода у вас многовато

покажите что лишнее.

Цитата(Abyx @  28.8.2010,  10:47 Найти цитируемый пост)
и сервера нет

сервер есть. но я его не стал выкладывать. пусть ТС хоть над чем-то подумает smile 

Автор: Abyx 28.8.2010, 16:04
1. POD-типы без полей-указателей можно передавать как есть. Алсо ТС не спрашивал как сериализовать структуру.
2. Если вы коннектитесь по IP, то резолвить ничего не надо.
3. tmperr не нужна.

Автор: boostcoder 28.8.2010, 16:10
Цитата(Abyx @  28.8.2010,  16:04 Найти цитируемый пост)
1. POD-типы без полей-указателей можно передавать как есть.

это ИМХО. я ни ТС. и не позволил бы себе "так" написать.

Цитата(Abyx @  28.8.2010,  16:04 Найти цитируемый пост)
2. Если вы коннектитесь по IP, то резолвить ничего не надо.

пример?

Цитата(Abyx @  28.8.2010,  16:04 Найти цитируемый пост)
3. tmperr не нужна. 

ну да.

Автор: Abyx 28.8.2010, 19:13
Цитата(boostcoder @  28.8.2010,  17:10 Найти цитируемый пост)
пример?

socket.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(ip), port));

Автор: boostcoder 28.8.2010, 19:15
спасибо smile 

Автор: gordmiand 29.8.2010, 18:16
Abyx: а где здесь центр помощи?...что-то никак не найду его....

Автор: boostcoder 29.8.2010, 18:38
Цитата(gordmiand @  29.8.2010,  18:16 Найти цитируемый пост)
а где здесь центр помощи?

а зачем тебе? половину кода тебе бесплатно написали smile

Добавлено через 23 секунды
напиши кому-нибудь из этой темы в личку.

Автор: Abyx 29.8.2010, 19:15
Цитата(boostcoder @  29.8.2010,  19:38 Найти цитируемый пост)
напиши кому-нибудь из этой темы в личку.

и бюджет сразу напишите.

Автор: gordmiand 29.8.2010, 21:24
Abyx: бюджет? а как же бескорыстная взаимопомощь, оказываемая на данном форуме? сегодня ты мне помог, а завтра - я тебе.... smile 

Автор: Addidas 6.10.2010, 19:40
Думаю товарищу Abyx помощь может не понадобится..  smile 

Автор: bigbuka 6.10.2010, 23:08
как по мне так простой memcpy в массив unsigned char
потом обычными сокетами передать все это дело 
и на клиентской стороне тотже memcpy в структуру

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)