void Server::AcceptClients() { TcpSocket c; Address from; if(c.Accept(server, from, false)) { std::wstring name = c.GetPeer().ToString(false); // Check password. Packet p; if(c.Receive(&p, sizeof(p), 1000) == sizeof(p) && (p.Control == C_CONNECT || p.Control == C_RESUME)) { if(password == 0 || password == ntohl(p.Password)) { // Check if a client is being booted by the new client. if(client.IsValid()) { std::wstring name = client.GetPeer().ToString(false); client.Close(); if(p.Control != C_RESUME) Log(OL_INFO, L"Replacing client %s\r\n", name.c_str()); } if(p.Control == C_CONNECT) Log(OL_NOTIFY | OL_INFO, L"Client connected from %s\r\n", name.c_str()); else Log(OL_INFO, L"Client resumed\r\n"); p.Control = C_CONNECT; c.Send(&p, sizeof(p)); client.Take(c); } else { p.Control = C_DISCONNECT; p.Reason = 1; Log(OL_INFO, L"Rejected client %s: Bad password\r\n", name.c_str()); } } else { p.Control = C_DISCONNECT; p.Reason = 0; Log(OL_INFO, L"Client failed to connect from %s\r\n", name.c_str()); } if(p.Control == C_DISCONNECT) { c.Send(&p, sizeof(p)); c.Close(); } } }
// play // stop // setTime(); // load( std::string operatorPath, BSONPtr data ) virtual void loadOperatorGraph( base::bson::BSONPtr operatorGraph ) { m_operatorGraph = operatorGraph; if( m_isConnected ) { // send command to client std::cout << "send loadOperatorGraph" << std::endl; //std::string test = "huhu"; //m_client.Send(test.c_str(), test.size()); // todo: base::bson::Helper command = base::bson::create(); command["command"] = "loadOperatorGraph"; command["operatorGraph"] = m_operatorGraph; base::bson::PacketPtr packet = base::bson::pack( command ); m_client.Send(packet->m_data, packet->m_size); // receive response //char buffer[1000]; //std::cout << "sending test message..." << std::endl; //int numBytesReceived = client.Receive( buffer, 10000000 ); //std::cout << numBytesReceived << std::endl; } }
int main(int argc, char const *argv[]) { // signal(SIGPIPE, SIG_IGN); //=========== client =========== if(argc == 3) { const char* ip = argv[1]; unsigned short port = (unsigned short)atoi(argv[2]); printf("ip %s\nport %hu\n", ip, port); TcpSocket sock; assert(sock.Init()); assert(sock.Connect(ip, port)); assert(sock.SetNonBlocking()); getchar(); char msg[] = "hello server"; int nsent; if(sock.CanSend()) { nsent = sock.Send((unsigned char*)msg, strlen(msg)); printf("nsent:%d\n", nsent); } else { printf("can not send\n"); } getchar(); if(1/*sock.CanSend()*/) { nsent = sock.Send((unsigned char*)msg, strlen(msg)); printf("nsent:%d\n", nsent); } else { printf("can not send\n"); } getchar(); if(sock.CanRecv()) { const int buf_len = 1024; char buf[buf_len]; memset(buf, 0, buf_len); int nread = sock.Recv((unsigned char*)buf, buf_len); printf("recv(%d): %s\n", nread, buf); } else { printf("can not recv\n"); } } //=========== server =========== else { printf("tcp echo server\n"); bool r = false; unsigned short port = 9999; TcpSocket sock; assert(sock.Init()); r = sock.Listen(port); assert(r == true); // sock.SetNonBlocking(); while(1) { printf("waiting for connection...\n"); TcpSocket client; assert(client.Init()); char ip_buf[32]; memset(ip_buf, 0, 32); bool b = sock.Accept(client, ip_buf); printf("client ip: %s\n", ip_buf); // client.SetNonBlocking(); while(b) { const int buf_len = 1024; char buf[buf_len]; memset(buf, 0, buf_len); if(1/*client.CanRecv()*/) { int nread = client.Recv((unsigned char*)buf, buf_len); printf("recv(%d): %s\n", nread, buf); toolbox::print_bytes(buf, strlen(buf) + 2); if(nread <= 0) { break; } if(client.CanSend()) { int nsent = client.Send((unsigned char*)buf, strlen(buf)); printf("send(%d): %s\n", nsent, buf); if(nsent <= 0) { break; } } else { printf("can not send\n"); } } else { printf("can not recv\n"); } sleep(1); } sleep(1); } } return 0; }