Прошу сделать review кода - класс udp-connection
От: Аноним  
Дата: 15.04.11 07:54
Оценка:
Код будет в общей либе, поэтому хочется максимально проверить на возможные косяки.

#ifndef CONNECTION_H
#define    CONNECTION_H

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <boost/asio.hpp>

namespace boost_ip = boost::asio::ip;

enum {
    max_length = 1024
};

class connection {
public:

    connection(boost::asio::io_service& io_service, short port)
    : _endpoint()
    , _socket(io_service, udp::endpoint(udp::v4(), port) ) {}

    /** @brief Get boost UDP socket (both client and server side)
     *  @return  socket (without any check) */
    boost_ip::udp::socket& socket() {
        return _socket;
    }

    /** @brief Read from socket to buffer */
    void read() {

        _socket.receive_from(
            boost::asio::buffer(&_inbound_data[0], _inbound_data.size())
            , _endpoint);
    }

    /** @brief Write buffer to socket */
    template <typename InputIterator>
    void write(InputIterator beg
        , InputIterator end
        , size_t packet_size) {

        _socket.send_to(boost::asio::buffer(&_outgoing_data[0], packet_size)
            , _endpoint);
    }

    /** @brief Async write buffer to socket
     *  This overloaded function does not flushes outgoing buffer,
     * so buffer saved before will be sent
     * @param handler custom completion handler for async operation
     * @param packet_size transferring object size */
    template <typename Handler>
    void async_write(Handler handler, size_t packet_size) {

        _socket.async_send_to(
        boost::asio::buffer(&_outgoing_data[0], packet_size)
            , _endpoint
            , handler);
    }

    /** @brief Async write buffer to socket
     * This overloaded function includes outgoing buffer flush and reassign.
     *  @param begin begin() iterator of serialized data container
     *  @param end end() iterator of serialized data container
     *  @param handler custom completion handler for async operation
     *  @param packet_size serialized object size */
    template <typename Handler, typename InputIterator>
    void async_write(InputIterator begin
    , InputIterator end
    , Handler handler
    , size_t packet_size) {

        set_outgoing_buffer(begin, end);
        _socket.async_send_to(boost::asio::buffer(&_outgoing_data[0], packet_size)
            , _endpoint
            , handler);
    }

    /** @brief Async read buffer from socket
     *  @param handler custom completion handler for async operation */
    template <typename Handler>
    void async_read(Handler handler) {

        _socket.async_receive_from(
        boost::asio::buffer(&_inbound_data[0], _inbound_data.size())
            , _endpoint
            , handler);
    }

    /** @brief Get inbound buffer data for read-only access
     *  @return inbound buffer as c-array     */
    const char* get_inbound_buffer() const {
        return _inbound_data.data();
    }

    /** @brief Get outgoing buffer data for read-only access
     *  @return outgoing buffer as c-array     */
    const char* get_outgoing_buffer() const {
        return _outgoing_data.data();
    }

    /** @brief Set outgoing buffer before send
     *  @param beg begin() iterator of serialized data container
     *  @param end end() iterator of serialized data container */
    template<typename InputIterator>
    void set_outgoing_buffer(InputIterator beg, InputIterator end) {
        std::memset(_outgoing_data.c_array(), 0x0, _outgoing_data.size());
        std::copy(beg, end, _outgoing_data.begin());
    }

    /**@brief Set client-side endpoint
     * @param e new endpoint */
    void set_endpoint(const boost_ip::udp::endpoint& e){
        _endpoint = e;
    }


private:

    /** @brief Endpoint (where should we send packet) */
    boost_ip::udp::endpoint _endpoint;

    /** @brief Boost UDP socket  */
    boost_ip::udp::socket _socket;

    /** @brief Container to store inboiund data */
    boost::array<char, max_length> _inbound_data;

    /** @brief Container to store outgoing data */
    boost::array<char, max_length> _outgoing_data;
};



#endif    /* CONNECTION_H */
Re: Прошу сделать review кода - класс udp-connection
От: Sharpeye Россия  
Дата: 15.04.11 08:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Код будет в общей либе, поэтому хочется максимально проверить на возможные косяки.


А>
А>    template <typename InputIterator>
А>    void write(InputIterator beg
А>        , InputIterator end
А>        , size_t packet_size) {

      Здесь, случаем, не пропущена строчка set_outgoing_buffer(begin, end)?

А>        _socket.send_to(boost::asio::buffer(&_outgoing_data[0], packet_size)
А>            , _endpoint);
А>    }
А>
Re: Прошу сделать review кода - класс udp-connection
От: uzhas Ниоткуда  
Дата: 15.04.11 08:41
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Код будет в общей либе, поэтому хочется максимально проверить на возможные косяки.


я в бусте ничего не понимаю, так что могу прокомментировать все остальное

успехов!
Re[2]: Прошу сделать review кода - класс udp-connection
От: Аноним  
Дата: 15.04.11 09:12
Оценка:
Здравствуйте, Sharpeye, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Код будет в общей либе, поэтому хочется максимально проверить на возможные косяки.


А>>
А>>    template <typename InputIterator>
А>>    void write(InputIterator beg
А>>        , InputIterator end
А>>        , size_t packet_size) {

S>      Здесь, случаем, не пропущена строчка set_outgoing_buffer(begin, end)?

А>>        _socket.send_to(boost::asio::buffer(&_outgoing_data[0], packet_size)
А>>            , _endpoint);
А>>    }
А>>


Да, пропущена, спасибо.
Не заметил, потому что явно вызывается из использующего класса.
Re[2]: Прошу сделать review кода - класс udp-connection
От: Аноним  
Дата: 15.04.11 09:17
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Аноним, Вы писали:


А>>Код будет в общей либе, поэтому хочется максимально проверить на возможные косяки.


U>я в бусте ничего не понимаю, так что могу прокомментировать все остальное

U>
U>успехов!


Спасибо, все по делу.
Re: Прошу сделать review кода - класс udp-connection
От: Kolobrodin Россия  
Дата: 15.04.11 10:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Код будет в общей либе, поэтому хочется максимально проверить на возможные косяки.


Ко всему вышесказанному присоединюсь.

По мелочам:
begin, end в параметрах методов можно заменить на first, last.

Еще такой вопрос: а какой смысл в doxygen-документации публиковать приватные члены класса?

Может лучше так:
// Endpoint (where should we send packet)
boost_ip::udp::endpoint _endpoint;

А вот doxygen-комментарий к классу необходим. Для чего предназначен класс и возможные примеры и нюансы использования?

boost::array<char, max_length> — можно затайпдефить, а max_length в параметры шаблона класса с значением по умолчанию.
Неоконченная мысль всегда казалась Шри Япутре слишком
Re[2]: Прошу сделать review кода - класс udp-connection
От: Kolobrodin Россия  
Дата: 15.04.11 10:06
Оценка:
И еще:

Страж: CONNECTION_H

Если это из правил написания кода компании, то следовало бы задуматься, что будет, если кто-то где-то еще добавит файл с классом connection.
Неоконченная мысль всегда казалась Шри Япутре слишком
Re[2]: Прошу сделать review кода - класс udp-connection
От: alsemm Россия  
Дата: 15.04.11 10:49
Оценка:
Здравствуйте, Kolobrodin, Вы писали:

K>По мелочам:

K>begin, end в параметрах методов можно заменить на first, last.
не очень хорошая идея, потому что обычно [begin, end), но [first, last]
Re[3]: Прошу сделать review кода - класс udp-connection
От: Kolobrodin Россия  
Дата: 15.04.11 10:53
Оценка: +1
Здравствуйте, alsemm, Вы писали:

A>Здравствуйте, Kolobrodin, Вы писали:


K>>По мелочам:

K>>begin, end в параметрах методов можно заменить на first, last.
A>не очень хорошая идея, потому что обычно [begin, end), но [first, last]

[front, back], но [first, last) http://www.cplusplus.com/reference/algorithm/copy/
Неоконченная мысль всегда казалась Шри Япутре слишком
Re[4]: Прошу сделать review кода - класс udp-connection
От: alsemm Россия  
Дата: 15.04.11 12:03
Оценка:
Здравствуйте, Kolobrodin, Вы писали:

K>[front, back], но [first, last) http://www.cplusplus.com/reference/algorithm/copy/

фу-ты, я перепутал с методами контейнеров begin() и end()
Re: Прошу сделать review кода - класс udp-connection
От: Kolobrodin Россия  
Дата: 15.04.11 12:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Код будет в общей либе, поэтому хочется максимально проверить на возможные косяки.




А> /** @brief Write buffer to socket */

А> template <typename InputIterator>
А> void write(InputIterator beg
А> , InputIterator end
А> , size_t packet_size) {

А> _socket.send_to(boost::asio::buffer(&_outgoing_data[0], packet_size)

А> , _endpoint);
А> }

А где используются beg и end?
Неоконченная мысль всегда казалась Шри Япутре слишком
Re[2]: Прошу сделать review кода - класс udp-connection
От: Kolobrodin Россия  
Дата: 15.04.11 12:23
Оценка:
Здравствуйте, Kolobrodin, Вы писали:

K>Здравствуйте, Аноним, Вы писали:


K>А где используются beg и end?


А, извиняюсь, увидел, что строка пропущена
Неоконченная мысль всегда казалась Шри Япутре слишком
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.