复制内容到剪贴板
代码:
// 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谢谢