Wednesday, July 29, 2009

Wife says: "I can't believe it works"

Just a teaser:

int main()
{
try
{
using asio::ip::tcp;
using namespace boost::lambda;

asio::io_service io_service;
tcp::acceptor acceptor(io_service,
tcp::endpoint(tcp::v4(), 54321));

const int max_clients = 100;
coroutine coro[max_clients];
std::auto_ptr<tcp::socket> socket[max_clients];
asio::error_code ec[max_clients];
std::size_t length[max_clients];
boost::array<char, 1024> data[max_clients];

// Kick off all the coroutines.
int n = -1;
for (int i = 0; i < max_clients; ++i)
{
socket[i].reset(new tcp::socket(io_service));
io_service.post(
unlambda((
var(n) = i
)));
}

for (; io_service.run_one() > 0; n = -1)
{
if (n != -1)
{
reenter (coro[n])
{
entry:
for (;;)
{
// Wait for a client to connect.
yield acceptor.async_accept(
*socket[n],
unlambda((
var(n) = n,
var(ec[n]) = _1
)));

// Echo at will.
while (!ec[n])
{
yield socket[n]->async_read_some(
asio::buffer(data[n]),
unlambda((
var(n) = n,
var(ec[n]) = _1,
var(length[n]) = _2
)));

if (!ec[n])
{
yield asio::async_write(
*socket[n],
asio::buffer(data[n], length[n]),
unlambda((
var(n) = n,
var(ec[n]) = _1
)));
}
}

// Clean up before accepting next client.
socket[n]->close();
}
}
}
}
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
}

One function. One fully asynchronous server. Bog standard C++.

9 comments:

macbirdie said...

Cute!

Thanks for boost::asio by the way!

Anonymous said...

yield in c++?

wait, what compiler is this using?

chris said...

Tested with: g++ 3.4.5, 4.1, 4.3 and 4.4; MSVC 8.0 and 9.0.

Obviously there's a little bit of something not shown in the snippet :)

Anonymous said...

I envy the fact that your wife understands enough about what you do to not understand how that works :~(

Gryffin said...

Thanks for this. learning a little more on asio. http://www.directics.com/altera/

john said...

آهنگ جدید
امین کامی ثابتی تو قلب من
دانلود آهنگ آصف آریا هیس
آهنگ کارن کیان دلتنگتم این روزا

youtube channel said...

What a good blog you have here. Please update it more often. This topics is my interest. Thank you. .

토토사이트
온라인카지노
파워볼사이트

dermatologist said...

I want to say thanks for beautiful blog sharing with us. Your blog really great resource to update my knowledge

스포츠토토
토토
안전놀이터
토토사이트

directory bristolpost said...

Thanks for providing recent updates regarding the concern, I look forward to read more

토토사이트
온라인카지노
파워볼게임
바카라사이트