⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testsock.cpp

📁 由GOOGLE的JINGLE项目中移植的网络库
💻 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 + -