Gnugk的Socket封装类yasocket
来源:互联网 发布:淘宝管家怎么用的 编辑:程序博客网 时间:2024/05/21 22:38
里面的代码我附上,是一个台湾同胞开发的!注意里面一个很重要的类YaSelectList,里面使用的是STL中的vector进行存储!其实我觉得如果使用list存储会更好,因为里面的socket删除操作比较频繁!
记得前面一个很重要的类:
TCPServer:
class TCPServer : public SocketsReader {
public:
TCPServer();
// add a TCP listener
void AddListener(TCPListenSocket *socket) { AddSocket(socket); }
// since listeners may be closed and deleted unexpectedly,
// the method provides a thread-safe way to close a listener
bool CloseListener(TCPListenSocket *socket);
private:
// override from class SocketsReader
virtual void ReadSocket(IPSocket *);
virtual void CleanUp();
};
继承类:SocketsReader
class SocketsReader : public RegularJob {
public:
SocketsReader(int = 1000);
~SocketsReader();
// override from class RegularJob
virtual void Stop();
protected:
// the derived classes should provide new interface to add sockets
void AddSocket(IPSocket *);
// new virtual function
// build a list of sockets for selecting
// return true if the list is not empty
// default behavior: put all sockets into the list
virtual bool BuildSelectList(SocketSelectList &);
// read data from the specified socket
virtual void ReadSocket(IPSocket *) = 0;
// clean up routine
// default behavior: delete sockets in m_removed
virtual void CleanUp();
bool SelectSockets(SocketSelectList &);
typedef std::list<IPSocket *>::iterator iterator;
typedef std::list<IPSocket *>::const_iterator const_iterator;
// remove closed sockets
void RemoveClosed(bool);
// for historical reason, assume the list has been locked
void RemoveSocket(iterator);
void RemoveSocket(IPSocket *);
PTimeInterval m_timeout;
std::list<IPSocket *> m_sockets, m_removed;
// keep the size of list since list::size() is not thread-safe
int m_socksize, m_rmsize;
mutable PReadWriteMutex m_listmutex;
mutable PMutex m_rmutex;
private:
// override from class Task
virtual void Exec();
};
实现方法见代码细节!
TCPServer的主执行函数
TCPServer::TCPServer()
{
SetName("TCPSrv");
Execute();
}
函数使用的是:
void SocketsReader::Exec()
{
ReadLock cfglock(ConfigReloadMutex);
SocketSelectList slist(GetName());
if (BuildSelectList(slist)) {
if (SelectSockets(slist)) {
int ss = slist.GetSize();
for (int i = 0; i < ss; ++i)
#ifdef LARGE_FDSET
ReadSocket(slist[i]);
#else
ReadSocket(dynamic_cast<IPSocket *>(slist[i]));
#endif
}
CleanUp();
} else {
CleanUp();
ConfigReloadMutex.EndRead();
PTRACE(6, GetName() << " waiting...");
Wait(SOCKETSREADER_IDLE_TIMEOUT);
ConfigReloadMutex.StartRead();
}
}
代码中使用了不少Mutex对象,对性能可能会有一些差异!
记得前面一个很重要的类:
TCPServer:
class TCPServer : public SocketsReader {
public:
TCPServer();
// add a TCP listener
void AddListener(TCPListenSocket *socket) { AddSocket(socket); }
// since listeners may be closed and deleted unexpectedly,
// the method provides a thread-safe way to close a listener
bool CloseListener(TCPListenSocket *socket);
private:
// override from class SocketsReader
virtual void ReadSocket(IPSocket *);
virtual void CleanUp();
};
继承类:SocketsReader
class SocketsReader : public RegularJob {
public:
SocketsReader(int = 1000);
~SocketsReader();
// override from class RegularJob
virtual void Stop();
protected:
// the derived classes should provide new interface to add sockets
void AddSocket(IPSocket *);
// new virtual function
// build a list of sockets for selecting
// return true if the list is not empty
// default behavior: put all sockets into the list
virtual bool BuildSelectList(SocketSelectList &);
// read data from the specified socket
virtual void ReadSocket(IPSocket *) = 0;
// clean up routine
// default behavior: delete sockets in m_removed
virtual void CleanUp();
bool SelectSockets(SocketSelectList &);
typedef std::list<IPSocket *>::iterator iterator;
typedef std::list<IPSocket *>::const_iterator const_iterator;
// remove closed sockets
void RemoveClosed(bool);
// for historical reason, assume the list has been locked
void RemoveSocket(iterator);
void RemoveSocket(IPSocket *);
PTimeInterval m_timeout;
std::list<IPSocket *> m_sockets, m_removed;
// keep the size of list since list::size() is not thread-safe
int m_socksize, m_rmsize;
mutable PReadWriteMutex m_listmutex;
mutable PMutex m_rmutex;
private:
// override from class Task
virtual void Exec();
};
实现方法见代码细节!
TCPServer的主执行函数
TCPServer::TCPServer()
{
SetName("TCPSrv");
Execute();
}
函数使用的是:
void SocketsReader::Exec()
{
ReadLock cfglock(ConfigReloadMutex);
SocketSelectList slist(GetName());
if (BuildSelectList(slist)) {
if (SelectSockets(slist)) {
int ss = slist.GetSize();
for (int i = 0; i < ss; ++i)
#ifdef LARGE_FDSET
ReadSocket(slist[i]);
#else
ReadSocket(dynamic_cast<IPSocket *>(slist[i]));
#endif
}
CleanUp();
} else {
CleanUp();
ConfigReloadMutex.EndRead();
PTRACE(6, GetName() << " waiting...");
Wait(SOCKETSREADER_IDLE_TIMEOUT);
ConfigReloadMutex.StartRead();
}
}
代码中使用了不少Mutex对象,对性能可能会有一些差异!
- Gnugk的Socket封装类yasocket
- GnuGk服务器的安装
- 封装自己的socket类
- C++封装的SOCKET类
- Socket编程封装的类
- gnugk、Openh323、ptlib的版本对应问题
- 自己封装的Socket类-Socket_Zmy
- Socket类自封装的实现
- 别人封装的socket
- TCP SOCKET封装类
- 一个简单的socket封装
- 对于Socket的简易封装
- muduo库的Socket封装
- 早期自己研究的Gnugk的源代码情景分析
- 一个基于事件模型的socket封装类CEventSocket
- 纯C++的Socket访问Http封装类
- 纯C++的Socket访问Http封装类 .
- 纯C++的Socket访问Http封装类
- UTF-16, 一种ISO 10646的编码方式
- Unicode UTF-8
- 线程是进程的一条执行路径
- Trends in Functional Programming (Vol 7) (Paperback), Sep.2007.eBook-BBL
- 浅解DLL
- Gnugk的Socket封装类yasocket
- C#枚举类型的使用示例
- extern "C" 的作用
- ProduKey v1.15
- 加载不同的样式
- J2SE 5.0与.NET 2.0部分技术参照
- RichEdit
- 中信证券的丑恶行经(南京营业部)
- 制作在wince系统上的安装程序