#include "tcpserver.h" #include #include #include #include #include #include using namespace std; TcpServer::TcpServer() { } bool TcpServer::start(int port) { if (mStarted) return true; mSocket = socket(AF_INET, SOCK_STREAM, 0); if (mSocket == -1) { perror("create tcp socket failed: %s"); return false; } int val = 1; setsockopt(mSocket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); int ret = ::bind(mSocket, (sockaddr*)&addr, sizeof(addr)); if (ret == -1) { perror("bind failed"); return false; } ret = listen(mSocket, 5); if (ret == -1) { perror("listen failed"); return false; } mStarted=true; thread thd(&TcpServer::keepAccept, this); thd.detach(); return true; } void TcpServer::whenNewClient(TcpServer::ClientHandler onClientConnected) { mClientHandler = onClientConnected; } void TcpServer::stop() { mStarted = false; close(mSocket); } void TcpServer::keepAccept() { while (mStarted) { sockaddr_in addr; socklen_t len = sizeof(addr); int ret = ::accept(mSocket, (sockaddr*)&addr, &len); if (ret < 0) { perror("failed to accept"); break; } if (mClientHandler) { mClientHandler(ret); } } }