Pocoはc++のライブラリの一つで、boostより比較的軽量に設計されている。バージョン1.7.3を使ってTCP通信のサーバー・クライアントの実装例を書いた。例外処理は甘いところがあるので適宜変更されたし。
サーバーの実装例
#include <iostream>
#include <Poco/Net/Socket.h>
#include <Poco/Net/TCPServer.h>
#include <Poco/Net/StreamSocket.h>
const int BYTE_LENGTH = 1024;
void tcp_send(Poco::Net::StreamSocket &ss, std::string str)
{
if (str.size() > BYTE_LENGTH) throw std::invalid_argument("str.size() > BYTE_LENGTH");
int ret = ss.sendBytes(str.c_str(), str.size());
if (ret < 0) throw std::exception();
}
std::string tcp_read(Poco::Net::StreamSocket &ss)
{
char data[BYTE_LENGTH];
int count = ss.receiveBytes(data, BYTE_LENGTH);
std::string str(data, count);
if (count == BYTE_LENGTH) throw std::exception();
return str;
}
int main() {
int port = 15001;
while (true) {
Poco::Net::ServerSocket *serv;
Poco::Net::StreamSocket *ss;
serv = new Poco::Net::ServerSocket(port);
serv->listen();
std::cout << "Waiting for connection";
ss = new Poco::Net::StreamSocket(serv->acceptConnection());
ss->setNoDelay(true);
std::cout << "\rConnected from " << ss->peerAddress().host().toString() << " " << ss->address().port() << std::endl;
try {
while (true) {
std::string str = tcp_read(*ss);
tcp_send(*ss, "You sent " + str);
std::cout << "I received \"" + str << "\"." << std::endl;
}
}
catch (...) {
ss->close();
serv->close();
}
}
}
クライアントの実装例
#include <iostream>
#include <Poco/Net/Socket.h>
#include <Poco/Net/StreamSocket.h>
#include <Poco/Thread.h>
const int BYTE_LENGTH = 1024;
void tcp_send(Poco::Net::StreamSocket &ss, std::string str)
{
if (str.size() > BYTE_LENGTH) throw std::invalid_argument("str.size() > BYTE_LENGTH");
int ret = ss.sendBytes(str.c_str(), str.size());
if (ret < 0) throw std::exception();
}
std::string tcp_read(Poco::Net::StreamSocket &ss)
{
char data[BYTE_LENGTH];
int count = ss.receiveBytes(data, BYTE_LENGTH);
std::string str(data, count);
if (count == BYTE_LENGTH) throw std::exception();
return str;
}
int main() {
int port = 15001;
std::string host = "localhost";
while (true) {
try {
Poco::Net::StreamSocket *ss;
auto address = Poco::Net::SocketAddress(host, port);
ss = new Poco::Net::StreamSocket(address.family());
ss->setNoDelay(true);
ss->connect(address);
try {
while (true) {
std::string str;
std::cin >> str;
tcp_send(*ss, str);
std::cout << "I received \"" + tcp_read(*ss) << "\"."<< std::endl;
}
}
catch (...) {
ss->close();
}
}
catch (...) {
Poco::Thread::sleep(1000);
std::cout << "Waiting for server to startup\n";
}
}
}