Exemplo n.º 1
0
int CwxSockConnector::complete (CwxSockStream &stream,
              CwxAddr *remoteAddr ,
              CwxTimeouter* timeout)
{
    if (timeout && timeout->isTimer())
    {
        if (CwxSocket::handleReady(stream.getHandle(), timeout, false, true, false, true) < 1)
        {
            CwxErrGuard guard;
            stream.close();
            return -1;
        }
    }

    int sock_err = 0;
    socklen_t sock_err_len = sizeof (sock_err);
    int sockopt_ret = ::getsockopt (stream.getHandle(), SOL_SOCKET, SO_ERROR,
        &sock_err, &sock_err_len);
    if ((sockopt_ret < 0) || sock_err)
    {
        stream.close();
        errno = sock_err;
        return -1;
    }

    if (remoteAddr != 0)
    {
        socklen_t len = remoteAddr->getSize ();
        sockaddr *addr = reinterpret_cast<sockaddr *> (remoteAddr->getAddr ());
        if (::getpeername(stream.getHandle(),
            addr,
            &len) == -1)
        {
            // Save/restore errno.
            CwxErrGuard guard;
            stream.close ();
            return -1;
        }
    }

    stream.setNonblock(false);
    return 0;

}
Exemplo n.º 2
0
int CwxSockConnector::connect (CwxSockStream& stream,
                               CwxAddr const& remoteAddr,
                               CwxAddr const& localAddr,
                               CwxTimeouter* timeout,
                               int protocol,
                               bool reuse_addr,
                               CWX_NET_SOCKET_ATTR_FUNC fn,
                               void* fnArg)
{
    if ((stream.getHandle() == CWX_INVALID_HANDLE) &&
        (stream.open(remoteAddr.getType(),
        SOCK_STREAM,
        protocol,
        reuse_addr) == -1))
    {
        return -1;

    }

    if (localAddr != CwxAddr::sap_any)
    {
        sockaddr *laddr = reinterpret_cast<sockaddr *> (localAddr.getAddr());
        int size = localAddr.getSize ();
        if (::bind (stream.getHandle (),
            laddr,
            size) == -1)
        {
            CwxErrGuard guard;
            stream.close ();
            return -1;
        }
    }
    // Enable non-blocking, if required.
    if ((timeout != 0) && (stream.setNonblock(true) == -1))
    {
        CwxErrGuard guard;
        stream.close ();
        return -1;
    }
    if (fn)
    {
        if (0 != fn(stream.getHandle(), fnArg))
        {
            CwxErrGuard guard;
            stream.close();
            return -1;
        }
    }
    int result = ::connect (stream.getHandle (),
        reinterpret_cast<sockaddr *> (remoteAddr.getAddr ()),
        remoteAddr.getSize ());

    if (result == -1 && timeout != 0)
    {
        // Check whether the connection is in progress.
        if (errno == EINPROGRESS || errno == EWOULDBLOCK)
        {
            // This expression checks if we were polling.
            if (*timeout->getTimeout() == CwxTimeValue::ZERO)
            {
                errno = EWOULDBLOCK;
            }
            // Wait synchronously using timeout.
            else if (this->complete (stream,
                0,
                timeout) == -1)
            {
            }
            else
            {
                return 0;
            }
        }
    }

    // EISCONN is treated specially since this routine may be used to
    // check if we are already connected.
    if (result != -1 || errno == EISCONN)
    {
        // Start out with non-blocking disabled on the new_stream.
        result = stream.setNonblock(false);
        if (result == -1)
        {
            CwxErrGuard guard;
            stream.close ();
        }
    }
    else if (!(errno == EWOULDBLOCK || errno == ETIMEDOUT))
    {
        CwxErrGuard guard;
        stream.close ();
    }
    return result;
}
Exemplo n.º 3
0
int main(int argc ,char** argv){
    int iRet = parseArg(argc, argv);

    if (0 == iRet) return 0;
    if (-1 == iRet) return 1;

    CwxSockStream  stream;
    CwxINetAddr  addr(g_unPort, g_strHost.c_str());
    CwxSockConnector conn;
    if (0 != conn.connect(stream, addr)){
        printf("Failure to connect ip:port: %s:%u, errno=%d\n", g_strHost.c_str(), g_unPort, errno);
        return 1;
    }
    CwxPackageWriterEx writer;
    CwxPackageReaderEx reader;
    CwxMsgHead head;
    CwxMsgBlock* block=NULL;
    char szErr2K[2048];
    char const* pErrMsg=NULL;
	CwxKeyValueItemEx item;
	CWX_UINT32 uiBufLen = UNISTOR_MAX_DATA_SIZE ;
	char* szBuf = (char*)malloc(uiBufLen);
	CwxEncodeXml xmlEncode;
	CwxXmlPackageConv xmlConv(&xmlEncode);
    CWX_UINT32 uiVersion=0;
    CWX_UINT32 uiFieldNum=0;
    if (g_file.length()){
		string strContent;
		if (!CwxFile::readTxtFile(g_file, strContent)){
			printf("Failure to read xml file:%s\n", g_file.c_str());
			free(szBuf);
			return -1;
		}
		if (!xmlConv.xmlToPackage(strContent.c_str(), szBuf, uiBufLen)){
			printf("Failure to convert xml, err:%s\n", xmlConv.getErrMsg());
			free(szBuf);
			return -1;
		}
        if (!reader.unpack(szBuf, uiBufLen)){
            printf("Failure to unpack msg, err:%s\n", reader.getErrMsg());
            free(szBuf);
            return -1;
        }
		CWX_UINT32 index=0;
		item.m_szData = reader.getKey(index)->m_szData;
		item.m_uiDataLen = reader.getKey(index)->m_uiDataLen;
		item.m_bKeyValue = reader.getKey(index)->m_bKeyValue;
	}else{
		item.m_szData = g_data.c_str();
		item.m_uiDataLen = g_data.length();
		item.m_bKeyValue = false;
	}

    CwxKeyValueItemEx  key;
    key.m_szData = g_key.c_str();
    key.m_uiDataLen = g_key.length();
    key.m_bKeyValue = false;
    CwxKeyValueItemEx  field;
    field.m_szData = g_field.c_str();
    field.m_uiDataLen = g_field.length();
    field.m_bKeyValue = false;
    CwxKeyValueItemEx  extra;
    extra.m_szData = g_extra.c_str();
    extra.m_uiDataLen = g_extra.length();
    extra.m_bKeyValue = false;

	do {
		if (UNISTOR_ERR_SUCCESS != UnistorPoco::packRecvAdd(
            &writer,
            block,
			100,
            key,
            g_field.length()?&field:NULL,
            g_extra.length()?&extra:NULL,
			item,
			g_uiExpire,
            g_sign,
            g_uiVersion,
            g_bCache,
            g_user.c_str(),
            g_passwd.c_str(),
			szErr2K))
		{
            printf("failure to pack add key package, err=%s\n", szErr2K);
            iRet = 1;
            break;
        }
        if (block->length() != (CWX_UINT32)CwxSocket::write_n(stream.getHandle(),
            block->rd_ptr(),
            block->length()))
        {
            printf("failure to send message, errno=%d\n", errno);
            iRet = 1;
            break;
        }
        CwxMsgBlockAlloc::free(block);
        block = NULL;
        //recv msg
        if (0 >= CwxSocket::read(stream.getHandle(), head, block))
        {
            printf("failure to read the reply, errno=%d\n", errno);
            iRet = 1;
            break;
        }
        if (UnistorPoco::MSG_TYPE_RECV_ADD_REPLY != head.getMsgType())
        {
            printf("recv a unknow msg type, msg_type=%u\n", head.getMsgType());
            iRet = 1;
            break;
        }
        if (UNISTOR_ERR_SUCCESS != UnistorPoco::parseRecvReply(&reader,
            block,
            iRet,
            uiVersion,
            uiFieldNum,
            pErrMsg,
            szErr2K))
        {
            printf("failure to unpack reply msg, err=%s\n", szErr2K);
            iRet = 1;
            break;
        }
        if (UNISTOR_ERR_SUCCESS != iRet)
        {
            printf("failure to add key, task_id=%u, err_code=%d, err=%s\n", head.getTaskId(), iRet, pErrMsg);
            iRet = 1;
            break;
        }
        iRet = 0;
        printf("success to add key[%s], data=%s, version=%u, fieldnum=%u, taskid=%u\n",
            g_key.c_str(),
			g_data.c_str(),
            uiVersion,
            uiFieldNum,
            head.getTaskId());
    } while(0);
    if (block) CwxMsgBlockAlloc::free(block);
    stream.close();
	free(szBuf);
    return iRet;
}
Exemplo n.º 4
0
int main(int argc, char** argv) {
  int iRet = parseArg(argc, argv);

  if (0 == iRet)  return 0;
  if (-1 == iRet) return 1;

  CwxSockStream stream;
  CwxINetAddr addr(g_unPort, g_strHost.c_str());
  CwxSockConnector conn;
  if (0 != conn.connect(stream, addr)) {
    printf("failure to connect ip:port: %s:%u, errno=%d\n", g_strHost.c_str(),
      g_unPort, errno);
    return 1;
  }
  CwxPackageWriter writer;
  CwxPackageReader reader;
  CwxMsgHead head;
  CwxMsgBlock* block = NULL;
  char szErr2K[2048];
  char const* pErrMsg = NULL;
  CwxKeyValueItem item;

  if (g_file.length()) {
    item.m_szData = g_szData;
    item.m_uiDataLen = g_uiDataLen;
  } else {
    item.m_szData = (char*) g_data.c_str();
    item.m_uiDataLen = g_data.length();
  }
  do {
    if (CWX_MQ_ERR_SUCCESS != CwxMqPoco::packRecvData(&writer,
      block,
      0,
      item,
      g_user.c_str(),
      g_passwd.c_str(),
      g_zip,
      szErr2K))
    {
      printf("failure to pack message package, err=%s\n", szErr2K);
      iRet = 1;
      break;
    }
    if (block->length() != (CWX_UINT32) CwxSocket::write_n(stream.getHandle(), block->rd_ptr(),
      block->length()))
    {
      printf("failure to send message, errno=%d\n", errno);
      iRet = 1;
      break;
    }
    CwxMsgBlockAlloc::free(block);
    block = NULL;
    //recv msg
    if (0 >= CwxSocket::read(stream.getHandle(), head, block)) {
      printf("failure to read the reply, errno=%d\n", errno);
      iRet = 1;
      break;
    }
    if (CwxMqPoco::MSG_TYPE_RECV_DATA_REPLY != head.getMsgType()) {
      printf("recv a unknow msg type, msg_type=%u\n", head.getMsgType());
      iRet = 1;
      break;
    }
    CWX_UINT64 ullSid;
    if (CWX_MQ_ERR_SUCCESS != CwxMqPoco::parseRecvDataReply(&reader,
      block,
      iRet,
      ullSid,
      pErrMsg,
      szErr2K))
    {
      printf("failure to unpack reply msg, err=%s\n", szErr2K);
      iRet = 1;
      break;
    }
    if (CWX_MQ_ERR_SUCCESS != iRet) {
      printf("failure to send message, err_code=%d, err=%s\n", iRet, pErrMsg);
      iRet = 1;
      break;
    }
    iRet = 0;
    printf("success to send msg, data's sid=%s\n",
      CwxCommon::toString(ullSid, szErr2K, 10));
  } while (0);
  if (g_szData) free(g_szData);
  if (block) CwxMsgBlockAlloc::free(block);
  stream.close();
  return iRet;
}
Exemplo n.º 5
0
int main(int argc ,char** argv)
{
    int iRet = parseArg(argc, argv);

    if (0 == iRet) return 0;
    if (-1 == iRet) return 1;

    CwxSockStream  stream;
    CwxINetAddr  addr(g_unPort, g_strHost.c_str());
    CwxSockConnector conn;
    if (0 != conn.connect(stream, addr))
    {
        printf("Failure to connect ip:port: %s:%u, errno=%d\n", g_strHost.c_str(), g_unPort, errno);
        return 1;
    }
    CwxPackageWriterEx writer;
    CwxPackageReaderEx reader;
    CwxMsgHead head;
    CwxMsgBlock* block=NULL;
    char szErr2K[2048];
    char const* pErrMsg=NULL;
    CWX_UINT32 uiVersion=0;
    CWX_UINT32 uiFieldNum=0;
    CwxKeyValueItemEx  key;
    key.m_szData = g_key.c_str();
    key.m_uiDataLen = g_key.length();
    key.m_bKeyValue = false;
    CwxKeyValueItemEx  field;
    field.m_szData = g_field.c_str();
    field.m_uiDataLen = g_field.length();
    field.m_bKeyValue = false;
    CwxKeyValueItemEx  extra;
    extra.m_szData = g_extra.c_str();
    extra.m_uiDataLen = g_extra.length();
    extra.m_bKeyValue = false;

	do 
    {
		if (UNISTOR_ERR_SUCCESS != UnistorPoco::packRecvDel(
            &writer,
            block,
			0,
			key,
            g_field.length()?&field:NULL,
            g_extra.length()?&extra:NULL,
            g_version,
            g_user.c_str(),
            g_passwd.c_str(),
			szErr2K))
		{
            printf("failure to pack delete key package, err=%s\n", szErr2K);
            iRet = 1;
            break;
        }
        if (block->length() != (CWX_UINT32)CwxSocket::write_n(stream.getHandle(),
            block->rd_ptr(),
            block->length()))
        {
            printf("failure to send message, errno=%d\n", errno);
            iRet = 1;
            break;
        }
        CwxMsgBlockAlloc::free(block);
        block = NULL;
        //recv msg
        if (0 >= CwxSocket::read(stream.getHandle(), head, block))
        {
            printf("failure to read the reply, errno=%d\n", errno);
            iRet = 1;
            break;
        }
        if (UnistorPoco::MSG_TYPE_RECV_DEL_REPLY != head.getMsgType())
        {
            printf("recv a unknow msg type, msg_type=%u\n", head.getMsgType());
            iRet = 1;
            break;
        }
        if (UNISTOR_ERR_SUCCESS != UnistorPoco::parseRecvReply(&reader,
            block,
            iRet,
            uiVersion,
            uiFieldNum,
            pErrMsg,
            szErr2K))
        {
            printf("failure to unpack reply msg, err=%s\n", szErr2K);
            iRet = 1;
            break;
        }
        if (UNISTOR_ERR_SUCCESS != iRet)
        {
            printf("failure to delete key, err_code=%d, err=%s\n", iRet, pErrMsg);
            iRet = 1;
            break;
        }
        iRet = 0;
        printf("success to delete key[%s], version=%u, field_num=%u\n",
            g_key.c_str(),
            uiVersion,
            uiFieldNum);
    } while(0);
    if (block) CwxMsgBlockAlloc::free(block);
    stream.close();
    return iRet;
}
Exemplo n.º 6
0
int main(int argc ,char** argv)
{
    int iRet = parseArg(argc, argv);

    if (0 == iRet) return 0;
    if (-1 == iRet) return 1;

    CwxSockStream  stream;
    CwxINetAddr  addr(g_unPort, g_strHost.c_str());
    CwxSockConnector conn;
    if (0 != conn.connect(stream, addr))
    {
        printf("Failure to connect ip:port: %s:%u, errno=%d\n", g_strHost.c_str(), g_unPort, errno);
        return 1;
    }
    CwxPackageWriterEx writer;
    CwxPackageWriterEx writer1;
    CwxPackageReaderEx reader;
    CwxMsgHead head;
    CwxMsgBlock* block=NULL;
    char szErr2K[2048];
	CWX_UINT32  output_buf_len = UNISTOR_MAX_KVS_SIZE;
	char* output_buf = (char*)malloc(output_buf_len);
	bool bGets=g_key.size()>1?true:false;
	do {
		string strField;
        list<string>::iterator iter = g_field.begin();
        while(iter != g_field.end()){
			if (!strField.length()){
				strField = *iter;
			}else{
				strField += "\n";
				strField += *iter;
			}
			iter++;
		}
        CwxKeyValueItemEx  field;
        field.m_szData = strField.c_str();
        field.m_uiDataLen = strField.length();
        field.m_bKeyValue = false;
        CwxKeyValueItemEx  extra;
        extra.m_szData = g_extra.c_str();
        extra.m_uiDataLen = g_extra.length();
        extra.m_bKeyValue = false;
        if (!bGets){
            CwxKeyValueItemEx  key;
            key.m_szData = g_key.begin()->c_str();
            key.m_uiDataLen = g_key.begin()->length();
            key.m_bKeyValue = false;
            if (UNISTOR_ERR_SUCCESS != UnistorPoco::packGetKey(&writer,
                block,
                100,
                key,
                strField.length()?&field:NULL,
                g_extra.length()?&extra:NULL,
                g_bVer,
                g_user.c_str(),
                g_passwd.c_str(),
                g_bMaster,
                g_ucKeyInfo,
                szErr2K))
            {
                printf("failure to pack get key package, err=%s\n", szErr2K);
                iRet = 1;
                break;
            }
        }else{
            list<pair<char const*, CWX_UINT16> > keys;
            list<string>::iterator iter = g_key.begin();
            while(iter != g_key.end()){
                keys.push_back(pair<char const*, CWX_UINT16>(iter->c_str(), iter->length()));
                iter++;
            }
            if (UNISTOR_ERR_SUCCESS != UnistorPoco::packGetKeys(&writer,
                &writer1,
                block,
                100,
                keys,
                strField.length()?&field:NULL,
                g_extra.length()?&extra:NULL,
                g_user.c_str(),
                g_passwd.c_str(),
                g_bMaster,
                g_ucKeyInfo,
                szErr2K))
            {
                printf("failure to pack gets key package, err=%s\n", szErr2K);
                iRet = 1;
                break;
            }
        }
		//send
		if (block->length() != (CWX_UINT32)CwxSocket::write_n(stream.getHandle(),
            block->rd_ptr(),
            block->length()))
        {
            printf("failure to send message, errno=%d\n", errno);
            iRet = 1;
            break;
        }
        CwxMsgBlockAlloc::free(block);
        block = NULL;
        //recv msg
        if (0 >= CwxSocket::read(stream.getHandle(), head, block))
        {
            printf("failure to read the reply, errno=%d\n", errno);
            iRet = 1;
            break;
        }

		if ((bGets?UnistorPoco::MSG_TYPE_RECV_GETS_REPLY:UnistorPoco::MSG_TYPE_RECV_GET_REPLY) != head.getMsgType())
        {
            printf("recv a unknow msg type, task_id=%u, msg_type=%u\n", head.getTaskId(), head.getMsgType());
            iRet = 1;
            break;
        }
		printf("query result, task_id=%u, len=%u, msg_len=%u\n", head.getTaskId(), head.getDataLen(), block->length());
		CwxPackageEx::dump(block->rd_ptr(),
			block->length(),
			output_buf,
			output_buf_len,
			"  ");
		printf("dump len:%u\n", output_buf_len);
		output_buf[output_buf_len] = 0x00;
        for (CWX_UINT32 i=0; i<output_buf_len; i++){
            if (0 == output_buf[i]) output_buf[i]=' ';
        }
		printf("%s\n", output_buf);
    } while(0);
    if (block) CwxMsgBlockAlloc::free(block);
	if (output_buf) free(output_buf);
    stream.close();
    return iRet;
}