- 授权协议: GPL
- 开发语言: C/C++
- 操作系统: 跨平台
- 软件首页: https://gitee.com/mycloudpeak/tin
- 软件文档: https://gitee.com/mycloudpeak/tin
软件介绍
tin 项目是完整实现的 C++ 版 go 语言运行时。它参考 go 语言运行时,将 go 语言运行时用 C++ 重写了一遍, 让你可以在 C++ 中使用 go 的风格写程序。
平台
Windows XP or later
OS X 10.8 or later
Linux 2.6.23 or later
构建
git clone --recursive https://github.com/cloudpeak/tin.git
mkdir build
cd build
Visual Studio 2015 Win64
cmake -G "Visual Studio 14 2015 Win64" ../tin -DCMAKE_BUILD_TYPE=RELEASE
Visual Studio 2015 Win32
cmake -G "Visual Studio 14 2015" ../tin -DCMAKE_BUILD_TYPE=RELEASE
Visual Studio 2008 Win32
cmake -G "Visual Studio 9 2008" ../tin -DCMAKE_BUILD_TYPE=RELEASE
GCC or Clang
cmake ../tin -DCMAKE_BUILD_TYPE=RELEASE && make
示例
#include "tin/all.h"
void HandleClient(tin::net::TcpConn conn) {
// Set TCP Read Write buffer.
conn->SetReadBuffer(64 * 1024);
conn->SetWriteBuffer(64 * 1024);
// user space buffer size.
const int kIOBufferSize = 4 * 1024;
scoped_ptr<char[]> buf(new char[kIOBufferSize]);
// set read, write deadline.
const int64 kRWDeadline = 20 * tin::kSecond;
conn->SetDeadline(kRWDeadline);
while (true) {
int n = conn->Read(buf.get(), kIOBufferSize);
int err = tin::GetErrorCode();
if (n > 0) {
conn->SetReadDeadline(kRWDeadline);
}
if (err != 0) {
VLOG(1) << "Read failed due to: " << tin::GetErrorStr();
// FIN received, graceful close, we can still send.
if (err == TIN_EOF) {
if (n > 0) {
conn->Write(buf.get(), n);
}
conn->CloseWrite();
// delay a while to avoid RST.
tin::NanoSleep(500 * tin::kMillisecond);
}
break;
}
DCHECK_GT(n, 0);
conn->Write(buf.get(), n);
if (tin::GetErrorCode() != 0) {
VLOG(1) << "Write failed due to " << tin::GetErrorStr();
break;
}
conn->SetWriteDeadline(kRWDeadline);
}
conn->Close();
}
int TinMain(int argc, char** argv) {
const uint16 kPort = 2222;
bool use_ipv6 = false;
tin::net::TCPListener listener =
tin::net::ListenTcp(use_ipv6 ? "0:0:0:0:0:0:0:0" : "0.0.0.0", kPort);
if (tin::GetErrorCode() != 0) {
LOG(FATAL) << "Listen failed due to " << tin::GetErrorStr();
}
LOG(INFO) << "echo server is listening on port: " << kPort;
while (true) {
tin::net::TcpConn conn = listener->Accept();
if (tin::GetErrorCode() == 0) {
tin::Spawn(&HandleClient, conn);
} else {
LOG(INFO) << "Accept failed due to " << tin::GetErrorStr();
}
}
return 0;
}
int main(int argc, char** argv) {
tin::Initialize();
// set logging level.
logging::SetMinLogLevel(logging::LOG_INFO);
// set max p count.
tin::Config config = tin::DefaultConfig();
config.SetMaxProcs(base::SysInfo::NumberOfProcessors());
// start the world.
tin::PowerOn(TinMain, argc, argv, &config);
// wait for power off
tin::WaitForPowerOff();
// cleanup.
tin::Deinitialize();
return 0;
}
Agile Web Application Development with Yii 1.1 and PHP5
Jeffrey Winesett / Packt Publishing / 2010-08-27
In order to understand the framework in the context of a real-world application, we need to build something that will more closely resemble the types of applications web developers actually have to bu......一起来看看 《Agile Web Application Development with Yii 1.1 and PHP5》 这本书的介绍吧!
