| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 639 人关注过本帖
标题:C++新手写了一个类用在Linux平台建立网络连接
只看楼主 加入收藏
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
结帖率:91.43%
收藏
 问题点数:0 回复次数:0 
C++新手写了一个类用在Linux平台建立网络连接
下面是源代码,欢迎拍砖,目前还没有学异常处理,所以暂时不考虑异常问题
程序代码:

//--------------------bpn_conn.hpp-----------------

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string>
#include <cstring>
#include <arpa/inet.h>
#include <unistd.h>

namespace BpNet{
//connect type
enum {TCP,UDP};

class bpn_conn
{
private:
    int         _sockfd;
    std::string _addr;
    int         _port;
    int         _type;
    std::string _ip;
    void        (*m_handle_func)(void*);
    sockaddr_in dst_addr;
public:
    bpn_conn(const std::string& addr, const int& port,
             const int& type = BpNet::TCP, void (*handle_func)(void*) = NULL):
        _addr(addr), _port(port), _type(type), m_handle_func(handle_func)
    {
        _sockfd = 0;
        std::string _ip = get_domain_ip(addr);

        //set addr infomation
        memset(&dst_addr, 0, sizeof(dst_addr));
        dst_addr.sin_port = htons((in_port_t)_port);
        dst_addr.sin_family = _type == AF_INET;
        dst_addr.sin_addr.s_addr = inet_addr(_ip.c_str());

        //set connect type
        if (_type == BpNet::TCP)
            _sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        else
            _sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    }
    int connect(unsigned timeout_sec = 0)
    {
        if (timeout_sec)
        {
            alarm(timeout_sec);
            ::connect(_sockfd, (sockaddr *)&dst_addr, sizeof(dst_addr));
            alarm(0);
        }
        else
            ::connect(_sockfd, (sockaddr *)&dst_addr, sizeof(dst_addr));

        //time out handles....
        return _sockfd;
    }

    static std::string get_domain_ip(const std::string &domain)
    {
        addrinfo hints, *host_info;
        char ipstr[INET6_ADDRSTRLEN];

        memset(&hints, 0, sizeof(host_info));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;

        //get the ip of domain name
        getaddrinfo(domain.c_str(), "80", &hints, &host_info);
        if (NULL != host_info)
        {
            sockaddr_in *tmp;
            tmp = (sockaddr_in*)(host_info->ai_addr);
            inet_ntop(AF_INET, &(tmp->sin_addr), ipstr, sizeof ipstr);
        }
        freeaddrinfo(host_info);
        host_info = NULL;
        return std::string(ipstr);
    }
    ~bpn_conn()
    {
        if(sockfd) ::close(sockfd);
    }

    void set_handle(void(*handle_func)(void *))
    {
        m_handle_func = handle_func;
    }
    
    void close()
    {
        ::close(_sockfd);
        _sockfd = 0;
    }
};
}   //namespace BpNet end



写完之后我问了一下旁边的人,我问他这代码是不是很难看,他居然说没有。

我的思路是这样的,构造函数构造一个bpn_conn实例,构造函数的四个参数分别为:
程序代码:
addr : 地址
port : 端口
type : 类型(TCP还是UDP)
handle_func : 建立连接之后用来处理连接的函数


其中get_domain_ip(addr)是用来进行域名解析的。connect成员函数用来发起连接的,由于不会异常处理,所以timeout_sec形同虚设。

这个类的代码不是很长,但是我写了好一会儿,发现好多东西还不太会。希望各位多多指教。

[ 本帖最后由 thlgood 于 2013-4-17 21:08 编辑 ]
搜索更多相关主题的帖子: Linux 网络连接 源代码 异常 
2013-04-17 21:05
快速回复:C++新手写了一个类用在Linux平台建立网络连接
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015752 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved