📄 testsock.cpp
字号:
#if defined(_MSC_VER) && _MSC_VER < 1300
#pragma warning(disable:4786 4530)
#endif
#include <vector>
#include "thread.h"
#include "socketaddress.h"
#include "messagequeue.h"
#include "sigslot.h"
#include "asyncsocket.h"
using namespace cricket;
class TDataSocketComm : public sigslot::has_slots<>
{
public:
TDataSocketComm(AsyncSocket * s) :socket_(s){
s->SignalCloseEvent.connect(this, &TDataSocketComm::OnClose); // 梆定 close 事件
s->SignalReadEvent.connect(this, &TDataSocketComm::OnReceive); // 梆定 receive 事件
}
virtual ~TDataSocketComm() {
if (socket_) {
socket_->Close();
delete socket_;
socket_ = NULL;
}
}
void OnReceive(AsyncSocket* sock_) {
// 处理数据或者通知其它模块处理
}
void OnClose(AsyncSocket* sock_, int err) {
DEBUGMSG(1, (TEXT("OnClose!\n"))); // 当remote 端断开tcp联接,该函数触发
}
AsyncSocket * socket_;
};
class TListenSocketComm : public sigslot::has_slots<>
{
public:
TListenSocketComm(TCommPara *pPara) {
SocketAddress address(pPara->IPPara.LocalIP, pPara->IPPara.Port);
// 创建一个用于listen的tcp socket;
socket_ = Thread::Current()->socketserver()->CreateAsyncSocket(SOCK_STREAM);
if (socket_) {
if (socket_->Bind(address) < 0) {
DEBUGMSG(1, (TEXT("Bind Socket Error!\n")));
return;
}
if (socket_->Listen(SOMAXCONN) < 0) {
DEBUGMSG(1, (TEXT("Listen Socket Error!\n")));
return;
}
socket_->SignalReadEvent.connect(this, &TListenSocketComm::OnAcceptEvent);
socket_->SignalCloseEvent.connect(this, &TListenSocketComm::OnCloseEvent);
}
}
virtual ~TListenSocketComm() {
};
AsyncSocket* socket_;
std::vector<TDataSocketComm * s> sockets;
private:
void OnAcceptEvent(AsyncSocket* socket) {
DEBUGMSG(1, (TEXT("OnAccept!\n")));
// 这里取得的newsocket就是用于收发数据的data socket
SocketAddress remote_addr;
AsyncSocket * newsocket
= static_cast<AsyncSocket *>(socket->Accpet(&remote_addr));
if (newsocket) {
TDataSocketComm * s = new TDataSocketComm(newsocket);
sockets.push_back(s);
}
}
void OnCloseEvent(AsyncSocket* sock_, int err) {
DEBUGMSG(1, (TEXT("Listen Socket OnClose::%d"), err));
}
};
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nShowCmd
)
{
Thread::Current()->Loop();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -