发新话题
打印

大家帮忙看看这个继承体系有啥问题?DarkSpy老大在不在?

大家帮忙看看这个继承体系有啥问题?DarkSpy老大在不在?

复制内容到剪贴板
代码:
// server.h

class basic_socket_server : public basic_socket {
protected:
  SOCKET_TYPE _socket;
  int LastError;

  void setLastError();

private:
  basic_socket_server(const basic_socket_server&);
  basic_socket_server& operator=(const basic_socket_server&);

  bool startup();
  void shutdown();

protected:
  explicit basic_socket_server(SOCKET_TYPE _sock = INVALID_SOCKET)
     : _socket(_sock), LastError(0) {
    startup();
  }

public:
  // Destructor
  virtual ~basic_socket_server();

  bool is_open() const {
    return (_socket != INVALID_SOCKET);
  }

  virtual SOCKET_TYPE getSocket() const;

  int getLastError() {
    setLastError();
    return LastError;
  }

  void close();

  /**
   * See if accept() can be called without blocking on it.
   */
  bool can_accept();

  virtual SOCKET_TYPE accept() = 0;
};

/////////////////////////////////////////////////////////////////////////////
// class ip_socket_server
/////////////////////////////////////////////////////////////////////////////
class ip_socket_server : public basic_socket_server {
protected:
  int _service;

  void setService(int service) {
    if(is_open())
      close();

    _service = service;
    open(_service);
  }

  bool bindToIpService(int service, int type, int protocol);

  explicit ip_socket_server(SOCKET_TYPE _sock = INVALID_SOCKET) :
             basic_socket_server(_sock), _service(0) {
  }
public:
  virtual ~ip_socket_server();

  int getService() {
      return _service;
  }

  virtual bool open(int service) = 0;
};

/////////////////////////////////////////////////////////////////////////////
// class tcp_socket_server
/////////////////////////////////////////////////////////////////////////////
class tcp_socket_server : public ip_socket_server {
public:
  tcp_socket_server() {
  }

  explicit tcp_socket_server(int service) : ip_socket_server() {
    setService(service);
  }

  // Destructor
  virtual ~tcp_socket_server();

  virtual SOCKET_TYPE accept();

  virtual bool open(int service);
};

/////////////////////////////////////////////////////////////////////////////
// class udp_socket_server
/////////////////////////////////////////////////////////////////////////////
class udp_socket_server : public ip_socket_server {
public:
  explicit udp_socket_server(int service) : ip_socket_server() {
    setService(service);
  }

  // Destructor
  virtual ~udp_socket_server();

  // return the socket used to send/recv UDP packets
  virtual SOCKET_TYPE accept();

  virtual bool open(int service);
};

=========================================================
// sskserver.hpp
#ifndef SSKSERVER_HPP_
#define SSKSERVER_HPP_

#include <string>
#include <skstream/skserver.h>


class sskserver : public tcp_socket_server {
public:
    sskserver() {}
    explicit sskserver(std::string& host, int servName = 0)
        : tcp_socket_server(servName) {
        open(host, servName);
    }
    bool open(std::string& host, int servName);
   

    ~sskserver() {}
protected:
    bool bindToIpService(std::string& host, int servName, int type, int protocol);
private:
   
    sskserver(const sskserver& rhs);
    sskserver& operator=(const sskserver& rhs);
};

#endif // SSKSERVER_HPP_

==========================================================
//sskserver.cpp
#include "sskserver.hpp"
#include <sys/types.h>
#include <netdb.h>

bool sskserver::bindToIpService(std::string& host, int servName, int type, int protocol)
{
    struct addrinfo req, *ans;
    char serviceName[32];

    ::sprintf(serviceName, "%d", servName);

    req.ai_flags = AI_PASSIVE;
    req.ai_family = PF_UNSPEC;
    req.ai_socktype = type;
    req.ai_protocol = 0;
    req.ai_addrlen = 0;
    req.ai_addr = 0;
    req.ai_canonname = 0;
    req.ai_next = 0;

    int ret;
    if ((ret = ::getaddrinfo(host.c_str(), serviceName, &req, &ans)) != 0) {
        std::cout << "skstream: " << gai_strerror(ret)
                  << std::endl << std::flush;
        setLastError();
        return false;
    }

    bool success = false;

    for(struct addrinfo * i = ans; success == false && i != 0; i = i->ai_next) {
        _socket = ::socket(i->ai_family, i->ai_socktype, i->ai_protocol);
        if (_socket == INVALID_SOCKET) {
            setLastError();
            continue;
        }

        sockaddr_storage iaddr;
        ::memcpy(&iaddr, i->ai_addr, i->ai_addrlen);
        SOCKLEN iaddrlen = i->ai_addrlen;

        if (::bind(_socket, (sockaddr*)&iaddr, iaddrlen) == SOCKET_ERROR) {
            setLastError();
            close();
        } else {
            success = true;
        }
    }

    ::freeaddrinfo(ans);

    return success;
}

bool open(std::string& host, int servName)
{
  if (is_open()) {
    close();
  }

  if (!bindToIpService(host, servName, SOCK_STREAM, IPPROTO_TCP)) {
    return false;
  }

  // Listen
  if(::listen(_socket, 5) == SOCKET_ERROR) { // max backlog
    setLastError();
    close();
    return false;
  }
   return true;
}
tcp_socket_server中没有提供对指定ip的绑定,从那里继承了一个,自己提供相关接口。
8 v; u2 E. s) v4 O0 |2 \可sskserver.cpp就是编译不过去。) e0 d& ?6 x; ~
大家帮忙看看这个继承有什么问题?
0 K& [3 ^: o: [  K& p: M% b0 Q+ \$ p谢谢      

TOP

复制内容到剪贴板
代码:
sskserver.cpp: In function `bool open(std::string&, int)':
sskserver.cpp:57: error: `is_open' undeclared (first use this function)
sskserver.cpp:57: error: (Each undeclared identifier is reported only once for each function it appears in.)
/usr/include/unistd.h:305: error: too few arguments to function `int close(int)'
sskserver.cpp:58: error: at this point in file
sskserver.cpp:61: error: `bindToIpService' undeclared (first use this function)
sskserver.cpp:66: error: `_socket' undeclared (first use this function)
sskserver.cpp:67: error: `setLastError' undeclared (first use this function)
/usr/include/unistd.h:305: error: too few arguments to function `int close(int)'
sskserver.cpp:68: error: at this point in file
这是在gcc-3.4.3上的编译错误,刚才忘记贴了。      

TOP

先把简单的 error 给 fix 了再说      
'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间

TOP

斑竹,我说的就是应为继承体系不对导致的问题。
4 a' q6 i3 @4 h$ x2 I因为本省skstream本身没有提供接口可以对环回接口进行服务监听,我就相继承一个提供相关接口做这件事情。
% L( K) G" |* l& C) ?可是,应为刚开始学习用C++写代码,其中继承的一些细节搞不大清楚,所以这个继承体系肯定什么地方违反的C++的规则,导致代码不能够编译。" W/ E8 Q7 N0 y* l) e
我想知道这个继承哪里错了。
9 ?2 d: w- Y, Y5 Z+ X2 `) L) [希望各位指点一二。      

TOP

为什么是我...      
-----------------------------------------
http://www.darkspy.org/blog

自大的人把宗教当迷信,无知的人把迷信当宗教

TOP

发新话题