Вопрос по сокетам (С++)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kravch_v, 16 Sep 2011.

  1. kravch_v

    kravch_v Member

    Joined:
    1 Sep 2011
    Messages:
    134
    Likes Received:
    43
    Reputations:
    1
    Гуглил, гуглил - ничего не нашел -
    Не гоните меня - я только начинаю изучать С++

    Собственно вот -
    Нужно подключиться к серверу => server : port
    После чего послать команды:
    cmd_1
    cmd_2
    cmd_3

    Помогите пожалуйста реализовать :rolleyes:
     
  2. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    обычно в учебниках ЯП "для профессионалов" всегда идет отдельной темой сетевое, постарайся изучить, потом учись коректно пользоваться поиском, а так же не бойся изучать чужой код :)
    вот на мсдне в примере, как раз то, что тебе нужно:
    http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socket.aspx#Y0
     
  3. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Отпрвляешь пакетами, каждый из которы будет состоять из :
    1. Команда(1 байт)
    2. Размер (2 или 4 байта)
    3. Данные того размера которые указал выше.

    Принимаешь так же, сначала один байт команды, потом два или четыре байта размер, а потом именно сколько байт данных. Потом ожидаешь следующий пакет.
     
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 inCode, в теме ясно сказано С++
    2 kravch_v, совершенно не с того начинаешь. Сетевое программирование сложная штука и без знания языка и устройства сети в целом - бесполезное занятие.

    Все давно разжовано - данная ссылка не раз публиковалась мной на форуме, пользуйся поиском и головой.
     
    _________________________
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Программирование в сетях Microsoft Windows. книга есть такая, толстая.
     
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Человек просит C++, давайте дадим ему простой пример на чистом C++. Вот программка, которая отправит Яндексу простой гет-запрос и считает первые 100 байтов ответа, асинхронно (необходим boost):

    PHP:
    #include <string>
    #include <iostream>
    #include <boost/asio.hpp>
    #include <boost/bind.hpp>
    #include <boost/function.hpp>

    class sender
    {
    public:
        
    template<typename handler>
        
    sender(boost::asio::io_serviceios, const boost::asio::ip::tcp::endpointephandler callback)
            :
    ios_(ios), socket_(ios)
        {
            
    memset(str0sizeof(str));
            
    ios.post(boost::bind(&sender::workerthisep));
            
    callback_ callback;
        }

    private:
        
    void worker(const boost::asio::ip::tcp::endpointep)
        {
    //коннектимся
            
    socket_.async_connect(epboost::bind(&sender::handle_connectthisboost::asio::placeholders::error));
        }

        
    void handle_connect(const boost::system::error_codeerr)
        {
            if(
    err)
            {
                
    callback_(err""0);
                return;
            }

    //этот запрос будем слать
            
    std::string to_write "GET / HTTP/1.0\r\nHost: ya.ru\r\n\r\n";

            
    boost::asio::async_write(socket_,
                
    boost::asio::buffer(to_writeto_write.length()),
                
    boost::bind(&sender::handle_writethis,
                
    boost::asio::placeholders::error));
        }

        
    void handle_write(const boost::system::error_codeerr)
        {
            if(
    err)
            {
                
    callback_(err""0);
                return;
            }

    //читаем только первые 100 байт ответа
            
    boost::asio::async_read(socket_boost::asio::buffer(str100),
                
    boost::bind(&sender::handle_readthis,
                
    boost::asio::placeholders::errorboost::asio::placeholders::bytes_transferred));
        }

        
    void handle_read(const boost::system::error_codeerrsize_t transferred)
        {
    //финальный коллбэк
            
    if(err)
            {
                
    callback_(err""transferred);
                return;
            }
            else
                
    callback_(errstrtransferred);
        }

        
    boost::asio::io_serviceios_;
        
    boost::asio::ip::tcp::socket socket_;
        
    boost::function<void(const boost::system::error_codeerr, const std::stringanswersize_t transferred)> callback_;
        
    char str[101];
    };

    //дернем эту функцию по завершении работы
    //она выведет ошибку (если какая-то возникла)
    //и количество принятых байтов
    void callback(const boost::system::error_codeerr, const std::stringanswersize_t transferred)
    {
        
    std::cout << "Bytes transferred: " << transferred << std::endl;
        if(
    err)
            
    std::cout << "Error: " << err.message() << std::endl;
        else
            
    std::cout << "Answer: " << answer << std::endl << std::endl;
    }

    int main()
    {
        
    boost::asio::io_service ios;

    //IP и порт ya.ru
        
    boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("213.180.204.3"), 80);

        
    sender ch(iosepcallback);
        
    ios.run();

        return 
    0;
    }
    Естественно, тут куча упрощений и нет проверки исключений в некоторых необходимых местах, но для начала сойдет.

    Если надо слать 3 команды - добавляем друг за другом больше коллбеков на запись-чтение, и все зависит от реализации сервера и типов команд.
     
    #6 GRRRL Power, 21 Sep 2011
    Last edited: 21 Sep 2011
    1 person likes this.