pgConn *dlgSelectConnection::CreateConn(wxString &applicationname, bool &createdNew) { /* gcc requires that we store this in temporary variables for some reason... */ wxString serv = cbServer->GetValue(); wxString db = cbDatabase->GetValue(); createdNew = true; long port = 0; if (serv.Find(':') > 0) { if (!serv.Mid(serv.Find(':') + 1).ToLong(&port)) { wxMessageBox(_("Invalid port number specified.")); return NULL; } serv = serv.Mid(0, serv.Find(':')); } wxString user = cbUsername->GetValue(); wxString role = cbRolename->GetValue(); if (cbConnection) { /* Check if selected combination already exists */ for (unsigned int index = 0; index < cbConnection->GetCount() - 1; index++) { pgConn *conn = (pgConn *)cbConnection->GetClientData(index); if (conn && conn->GetHost() == serv && conn->GetPort() == port && conn->GetUser() == user && conn->GetRole() == role && conn->GetDbname() == db) { createdNew = false; return conn; } } } int sslmode = remoteServer ? remoteServer->GetSSL() : 0; return CreateConn(serv, db, user, port, role, sslmode, applicationname, true); }
int pgDatabase::Connect() { if (!allowConnections) return PGCONN_REFUSED; if (!connected) { if (GetName() == server->GetDatabaseName() && server->connection()->GetStatus() == PGCONN_OK) { useServerConnection = true; conn = 0; } else { useServerConnection = false; wxString applicationname = appearanceFactory->GetLongAppName() + _(" - Browser"); conn = CreateConn(applicationname); if (!conn) { connected = false; return PGCONN_BAD; } } // Now we're connected. // check for extended ruleutils with pretty-print option wxString exprname = connection()->ExecuteScalar(wxT("SELECT proname FROM pg_proc WHERE proname='pg_get_viewdef' AND proargtypes[1]=16")); if (!exprname.IsEmpty()) prettyOption = wxT(", true"); UpdateDefaultSchema(); if (connection()->BackendMinimumVersion(9, 0)) { m_defPrivsOnTables = connection()->ExecuteScalar(wxT("SELECT defaclacl FROM pg_catalog.pg_default_acl dacl WHERE dacl.defaclnamespace = 0::OID AND defaclobjtype='r'")); m_defPrivsOnSeqs = connection()->ExecuteScalar(wxT("SELECT defaclacl FROM pg_catalog.pg_default_acl dacl WHERE dacl.defaclnamespace = 0::OID AND defaclobjtype='S'")); m_defPrivsOnFuncs = connection()->ExecuteScalar(wxT("SELECT defaclacl FROM pg_catalog.pg_default_acl dacl WHERE dacl.defaclnamespace = 0::OID AND defaclobjtype='f'")); } connected = true; } return connection()->GetStatus(); }
//启动服务器 void Client::Start() { //connect log::log(Info,"start Client..."); m_clientState = true; //相当于epoll_ctl_add log::log(Info,"m_selector.size:",m_selector->Size()); log::log(Info,"run Client"); //创建连接 CreateConn(); while(m_clientState) { //非阻塞的connect这里不触发事件 m_selector->Select(); m_wheeltimer->Click(); } }
pgConn *dlgSelectConnection::CreateConn(wxString& applicationname) { /* gcc requires that we store this in temporary variables for some reason... */ wxString serv = cbServer->GetValue(); wxString db = cbDatabase->GetValue(); long port = 0; if (serv.Find(':') > 0) { if (!serv.Mid(serv.Find(':')+1).ToLong(&port)) { wxMessageBox(_("Invalid port number specified.")); return NULL; } serv = serv.Mid(0, serv.Find(':')); } wxString user = cbUsername->GetValue(); return CreateConn(serv, db, user, port, 0, applicationname, true); }
// ------------------------------------------------------------------------------------------------ int main(int argc, const char **argv) { // Common variables NetBuf *inPkt; TcpHeader *inHdr; Packet *outPkt; TcpHeader *outHdr; TcpConn *conn; TestSetup(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_CLOSED, "RST", "segment dropped"); inPkt = NetAllocBuf(); inHdr = (TcpHeader *)inPkt->start; inHdr->srcPort = 100; inHdr->dstPort = 101; inHdr->seq = 1; inHdr->ack = 2; inHdr->off = 5 << 4; inHdr->flags = TCP_RST; inHdr->windowSize = TCP_WINDOW_SIZE; inHdr->checksum = 0; inHdr->urgent = 0; TcpInput(inPkt); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_CLOSED, "ACK", "RST sent"); inPkt = NetAllocBuf(); inHdr = (TcpHeader *)inPkt->start; inHdr->srcPort = 100; inHdr->dstPort = 101; inHdr->seq = 1; inHdr->ack = 2; inHdr->off = 5 << 4; inHdr->flags = TCP_ACK; inHdr->windowSize = TCP_WINDOW_SIZE; inHdr->checksum = 0; inHdr->urgent = 0; TcpInput(inPkt); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, 101); ASSERT_EQ_UINT(outHdr->dstPort, 100); ASSERT_EQ_UINT(outHdr->seq, 2); ASSERT_EQ_UINT(outHdr->ack, 0); ASSERT_EQ_HEX8(outHdr->flags, TCP_RST); free(outPkt); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_CLOSED, "no ACK", "RST/ACK sent"); inPkt = NetAllocBuf(); inHdr = (TcpHeader *)inPkt->start; inHdr->srcPort = 100; inHdr->dstPort = 101; inHdr->seq = 1; inHdr->ack = 2; inHdr->off = 5 << 4; inHdr->flags = 0; inHdr->windowSize = TCP_WINDOW_SIZE; inHdr->checksum = 0; inHdr->urgent = 0; TcpInput(inPkt); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, 101); ASSERT_EQ_UINT(outHdr->dstPort, 100); ASSERT_EQ_UINT(outHdr->seq, 0); ASSERT_EQ_UINT(outHdr->ack, 1); ASSERT_EQ_HEX8(outHdr->flags, TCP_RST | TCP_ACK); free(outPkt); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_CLOSED, "connect", "goto SYN_SENT"); conn = CreateConn(); ASSERT_TRUE(TcpConnect(conn, &s_ipAddr, 80)); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_TRUE(outHdr->srcPort >= 49152); ASSERT_EQ_UINT(outHdr->dstPort, 80); ASSERT_EQ_UINT(outHdr->seq, conn->iss); ASSERT_EQ_UINT(outHdr->ack, 0); ASSERT_EQ_HEX8(outHdr->flags, TCP_SYN); ASSERT_EQ_UINT(outHdr->windowSize, TCP_WINDOW_SIZE); ASSERT_EQ_UINT(outHdr->urgent, 0); free(outPkt); ExitState(conn, TCP_SYN_SENT); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_SENT, "Bad ACK, no RST", "RST sent"); conn = CreateConn(); EnterState(conn, TCP_SYN_SENT); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss, TCP_ACK); TcpInput(inPkt); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort); ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort); ASSERT_EQ_UINT(outHdr->seq, inHdr->ack); ASSERT_EQ_UINT(outHdr->ack, 0); ASSERT_EQ_HEX8(outHdr->flags, TCP_RST); free(outPkt); ExitState(conn, TCP_SYN_SENT); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_SENT, "Bad ACK, RST", "segment dropped"); conn = CreateConn(); EnterState(conn, TCP_SYN_SENT); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss, TCP_RST | TCP_ACK); TcpInput(inPkt); ExitState(conn, TCP_SYN_SENT); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_SENT, "ACK, RST", "conn locally reset"); conn = CreateConn(); EnterState(conn, TCP_SYN_SENT); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss + 1, TCP_RST | TCP_ACK); TcpInput(inPkt); ExpectError(TCP_CONN_RESET); ExitState(conn, TCP_CLOSED); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_SENT, "no ACK, RST", "segment dropped"); conn = CreateConn(); EnterState(conn, TCP_SYN_SENT); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss + 1, TCP_RST); TcpInput(inPkt); ExitState(conn, TCP_SYN_SENT); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_SENT, "SYN, ACK", "goto ESTABLISHED"); conn = CreateConn(); EnterState(conn, TCP_SYN_SENT); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss + 1, TCP_SYN | TCP_ACK); TcpInput(inPkt); ASSERT_EQ_UINT(conn->irs, 1000); ASSERT_EQ_UINT(conn->rcvNxt, 1001); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort); ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort); ASSERT_EQ_UINT(outHdr->seq, conn->iss + 1); ASSERT_EQ_UINT(outHdr->ack, 1001); ASSERT_EQ_HEX8(outHdr->flags, TCP_ACK); free(outPkt); ExitState(conn, TCP_ESTABLISHED); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_SENT, "SYN, no ACK", "goto SYN_RECEIVED, resend SYN,ACK"); conn = CreateConn(); EnterState(conn, TCP_SYN_SENT); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, 1000, 0, TCP_SYN); TcpInput(inPkt); ASSERT_EQ_UINT(conn->irs, 1000); ASSERT_EQ_UINT(conn->rcvNxt, 1001); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort); ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort); ASSERT_EQ_UINT(outHdr->seq, conn->iss); ASSERT_EQ_UINT(outHdr->ack, 1001); ASSERT_EQ_HEX8(outHdr->flags, TCP_SYN | TCP_ACK); free(outPkt); ExitState(conn, TCP_SYN_RECEIVED); TestCaseEnd(); // -------------------------------------------------------------------------------------------- uint generalStates[] = { TCP_SYN_RECEIVED, TCP_ESTABLISHED, TCP_FIN_WAIT_1, TCP_FIN_WAIT_2, TCP_CLOSE_WAIT, TCP_CLOSING, TCP_LAST_ACK, TCP_TIME_WAIT, 0, }; for (uint *pState = generalStates; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "Bad seq, no RST", "resend ACK"); conn = CreateConn(); EnterState(conn, state); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt - 1, conn->sndNxt, TCP_ACK); TcpInput(inPkt); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort); ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort); ASSERT_EQ_UINT(outHdr->seq, conn->sndNxt); ASSERT_EQ_UINT(outHdr->ack, conn->rcvNxt); ASSERT_EQ_HEX8(outHdr->flags, TCP_ACK); free(outPkt); ExitState(conn, state); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- for (uint *pState = generalStates; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "Bad seq, RST", "segment dropped"); conn = CreateConn(); EnterState(conn, state); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt - 1, conn->sndNxt, TCP_RST | TCP_ACK); TcpInput(inPkt); ExitState(conn, state); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_RECEIVED, "RST, active", "conn refused"); conn = CreateConn(); EnterState(conn, TCP_SYN_RECEIVED); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, 0, TCP_RST); TcpInput(inPkt); ExpectError(TCP_CONN_REFUSED); TestCaseEnd(); // -------------------------------------------------------------------------------------------- uint rstStates1[] = { TCP_ESTABLISHED, TCP_FIN_WAIT_1, TCP_FIN_WAIT_2, TCP_CLOSE_WAIT, 0, }; for (uint *pState = rstStates1; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "RST", "conn reset"); conn = CreateConn(); EnterState(conn, state); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, 0, TCP_RST); TcpInput(inPkt); ExpectError(TCP_CONN_RESET); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- uint rstStates2[] = { TCP_CLOSING, TCP_LAST_ACK, TCP_TIME_WAIT, 0, }; for (uint *pState = rstStates2; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "RST", "conn closed"); conn = CreateConn(); EnterState(conn, state); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, 0, TCP_RST); TcpInput(inPkt); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- for (uint *pState = generalStates; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "SYN", "conn reset, RST sent"); conn = CreateConn(); EnterState(conn, state); u16 localPort = conn->localPort; u16 remotePort = conn->remotePort; u32 rcvNxt = conn->rcvNxt; inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_SYN); TcpInput(inPkt); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, localPort); ASSERT_EQ_UINT(outHdr->dstPort, remotePort); ASSERT_EQ_UINT(outHdr->seq, 0); ASSERT_EQ_UINT(outHdr->ack, rcvNxt); ASSERT_EQ_HEX8(outHdr->flags, TCP_RST | TCP_ACK); free(outPkt); ExpectError(TCP_CONN_RESET); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_RECEIVED, "bad ACK", "RST sent"); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_SYN_RECEIVED, "ACK", "goto ESTABLISHED"); TestCaseEnd(); // -------------------------------------------------------------------------------------------- uint ackStates[] = { TCP_ESTABLISHED, TCP_FIN_WAIT_1, TCP_FIN_WAIT_2, TCP_CLOSE_WAIT, TCP_CLOSING, 0 }; for (uint *pState = ackStates; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "ACK", "update pointers"); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- for (uint *pState = ackStates; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "dup ACK", "ignore"); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- for (uint *pState = ackStates; *pState; ++pState) { uint state = *pState; TestCaseBegin(state, "unsent ACK", "resend ACK"); TestCaseEnd(); } // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_FIN_WAIT_1, "ACK, FIN not ACK'd", "ignore"); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_CLOSING, "ACK, FIN not ACK'd", "ignore"); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_FIN_WAIT_1, "ACK, FIN ACK'd", "goto FIN-WAIT-2"); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_CLOSING, "ACK, FIN ACK'd", "goto TIME-WAIT"); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_LAST_ACK, "ACK, FIN not ACK'd", "ignore"); conn = CreateConn(); EnterState(conn, TCP_LAST_ACK); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt - 1, TCP_ACK); TcpInput(inPkt); ExitState(conn, TCP_LAST_ACK); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_LAST_ACK, "ACK, FIN ACK'd", "goto CLOSED"); conn = CreateConn(); EnterState(conn, TCP_LAST_ACK); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_ACK); TcpInput(inPkt); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_TIME_WAIT, "ACK, no FIN", "ignore"); conn = CreateConn(); EnterState(conn, TCP_TIME_WAIT); inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_ACK); TcpInput(inPkt); ExitState(conn, TCP_TIME_WAIT); TestCaseEnd(); // -------------------------------------------------------------------------------------------- TestCaseBegin(TCP_TIME_WAIT, "FIN", "reset 2MSL timer"); conn = CreateConn(); EnterState(conn, TCP_TIME_WAIT); g_pitTicks += 1000; inPkt = NetAllocBuf(); inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_FIN | TCP_ACK); TcpInput(inPkt); outPkt = PopPacket(); outHdr = (TcpHeader *)outPkt->data; TcpSwap(outHdr); ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort); ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort); ASSERT_EQ_UINT(outHdr->seq, conn->sndNxt); ASSERT_EQ_UINT(outHdr->ack, conn->rcvNxt); ASSERT_EQ_HEX8(outHdr->flags, TCP_ACK); free(outPkt); ASSERT_EQ_UINT(conn->mslWait, g_pitTicks + 2 * TCP_MSL); ExitState(conn, TCP_TIME_WAIT); TestCaseEnd(); return EXIT_SUCCESS; }