예제 #1
0
std::pair<TcpSocket, TcpSocket>
PcapGen::create_connection(const std::string& client_addr,
                           const std::string& server_addr)
{
    auto state = std::make_shared<TcpConnectionState>();

    state->state[0] = parse_addr(client_addr);
    state->state[1] = parse_addr(server_addr);

    perform_tcp_handshake(state->state[0], state->state[1]);

    return std::make_pair(TcpSocket(shared_from_this(), state, 0),
                          TcpSocket(shared_from_this(), state, 1));
}
예제 #2
0
	const TcpSocket TcpSocket::Create()
	{
		int desc = ::socket(PF_INET, SOCK_STREAM, 0);
		if (desc == -1)
		{
			throw UnixError();
		}

		return TcpSocket(desc);
	}
예제 #3
0
void
CThread::AsciiForceError(int key, msghdr &msghdr)
{
    ErrType			    et;
    bool			    expDropConn;
    string			    expText;
    string			    gotText;
    Action			    act;
    struct iovec		    *iovP;
    char			    cp0[256];	    // iov0 replacement buffer
    bool			    doubleRx;
 
    //
    // any command that has data following the header should not be tested for aUnkCmd
    // the server reads the header, replies (24 bytes) and then reads expecting a header
    // but normally gets an invalid magic number.
    //
    //	the data type test is ignored because the server ignores the data type
    //
    static const Action action[eCmdCnt][eErrCnt] = {			// must match ECmd order
	// magic	cmd	    key
	{ aSkip,	aError2,    aSkip,	aSkip },		// set cmd
	{ aSkip,	aError2,    aSkip,	aSkip },		// add cmd
	{ aSkip,	aError2,    aSkip,	aSkip },		// rep cmd
	{ aSkip,	aError2,    aSkip,	aSkip },		// app cmd
	{ aSkip,	aError2,    aSkip,	aSkip },		// pre cmd
	{ aSkip,	aError2,    aSkip,	aSkip },		// cas cmd
	{ aSkip,	aError,	    aSkip,	aSkip },		// get cmd
	{ aSkip,	aSkip,	    aSkip,	aSkip },		// gets cmd
	{ aSkip,	aSkip,	    aSkip,	aSkip },		// getk cmd
	{ aSkip,	aSkip,	    aSkip,	aSkip },		// getr cmd
        { aSkip,	aError,	    aSkip,	aSkip },		// gat cmd
	{ aSkip,	aError,	    aSkip,	aSkip },		// inc cmd
	{ aSkip,	aError,	    aSkip,	aSkip },		// dec cmd
	{ aSkip,	aError,	    aSkip,	aSkip },		// del cmd
	{ aSkip,	aError,	    aSkip,	aSkip },		// touch cmd
	{ aSkip,	aError,	    aSkip,	aSkip },		// stat cmd
	{ aSkip,	aError,	    aSkip,	aSkip },		// ver cmd
	{ aSkip,	aSkip,	    aSkip,	aSkip },		// nop cmd

    };

    expText = "";
    do {
	et = (ErrType)(m_rnd() % eErrCnt);
    } while(et == eMagic || et == eDataType || et == eKeyLen);			    // no magic in ascii
    iovP = msghdr.msg_iov;
    memcpy(cp0, iovP[0].iov_base, iovP[0].iov_len);
    iovP[0].iov_base = cp0;
    act = action[m_cmdCmd][et];
    if(m_trace2) {
        printf("command %s   error %s   action %s\n",
	    cmdStr[m_cmdCmd], errStr[et], actStr[act]);
    }
    switch(et) {		// do the actual error
	case eMagic:
	    assert(0);
	    break;
	case eCmd:
	    cp0[0] = 'X';		    // no command starts with X
	    break;
	case eKeyLen:
	    iovP[1].iov_base = 0;	    // remove key
	    iovP[1].iov_len = 0;
	    break;
	case eDataType:			 // ascii has no datatype
	    break;

	default:
	    return;
	    assert(0);
    }
    expDropConn = false;
    doubleRx = false;
    expText = "";
    switch(act) {
	case aTAS:			// test and stop
	    break;
	case aSkip:
	    if(m_trace2) {
		printf("\n");
	    }
	    return;			// legal case
	case aError:
	    expText = "ERROR\r\n";
	    break;
	case aError2:
	    expText = "ERROR\r\n";
	    doubleRx = true;
	    break;
	case aDropConn:
	    expDropConn = true;
	    break;
	case aUnkCmd:
	    expText = "Unknown command";
	    break;
	case aInvArg:
	    expText = "Invalid arguments";
	    expDropConn = true;
	    break;
	case aNotFound:
	    expText = "Not found";
	    expDropConn = true;
	    break;
	default:
	    assert(0);
    }

    if(m_trace2) {
	printf("forcing %s error  ", errStr[et]);
    }
    SendMsg(msghdr);
    if(act == aTAS) {
	printf("\nTAS  Hit enter to continue  or ^C to exit ");
	fflush(stdout);
	getc(stdin);
    }
    if(expText.length() != 0) {
	if(m_trace2) {
	    printf("expText  ");
	}
	m_tcpRespBufLen = recv(m_tcpFd, m_tcpRespBuf, expText.length(), 0);
	if(m_trace2) {
	    printf("recieved %ld bytes   ", m_tcpRespBufLen);
	}
    }
    if(expDropConn == true) {		// expect connection to drop
	fd_set  read;
	timeval tv = {0,100000};		// wait 1 sec
	FD_ZERO(&read);
	FD_SET(m_tcpFd, &read);
	int sel = select(m_tcpFd + 1, &read, 0, 0, &tv);
	if(m_trace2) {
	    printf("sel %d ", sel);
	}
	if(sel > 0) {
	    m_tcpRespBufLen = recv(m_tcpFd, m_tcpRespBuf, RESP_BUF_SIZE, 0);
	    if(m_trace2) {
		printf("recieved %ld bytes   ", m_tcpRespBufLen);
	    }
	}
        closesocket(m_tcpFd);
	TcpSocket();		    // reopen
    }

    if(expText.length() != 0) {
	m_tcpRespBuf[m_tcpRespBufLen] = 0;
	if(expText.compare(m_tcpRespBuf) != 0) {
	    gotText = m_tcpRespBuf;
	    ErrorMsg("Error test failed, ", &expText, &gotText);
	}
    }
    if(doubleRx) {
	m_tcpRespBufLen = recv(m_tcpFd, m_tcpRespBuf, RESP_BUF_SIZE, 0);
    }
    if(1) {		// possible connection to drop
	fd_set  read;
	timeval tv = {0,10000};		// wait
	FD_ZERO(&read);
	FD_SET(m_tcpFd, &read);
	int sel = select(m_tcpFd + 1, &read, 0, 0, &tv);
	m_tcpRespBufLen = 1;
	if(sel > 0) {
	    m_tcpRespBufLen = recv(m_tcpFd, m_tcpRespBuf, RESP_BUF_SIZE, 0);
	    if(m_trace2) {
		printf("recieved %ld bytes   ", m_tcpRespBufLen);
	    }
	}
	if(sel < 0 || m_tcpRespBufLen == 0 || (int)m_tcpRespBufLen == -1) {
	    closesocket(m_tcpFd);
	    TcpSocket();		    // reopen
	}
    }
    if(m_trace2) {
	printf("\n\n");
    }
    m_tcpRespBufLen = 0;
}