示例#1
0
文件: io.c 项目: Eppo791906066/cyassl
/* The NetX receive callback
 *  return :  bytes read, or error
 */
int NetX_Receive(CYASSL *ssl, char *buf, int sz, void *ctx)
{
    NetX_Ctx* nxCtx = (NetX_Ctx*)ctx;
    ULONG left;
    ULONG total;
    ULONG copied = 0;
    UINT  status;

    if (nxCtx == NULL || nxCtx->nxSocket == NULL) {
        CYASSL_MSG("NetX Recv NULL parameters");
        return CYASSL_CBIO_ERR_GENERAL;
    }

    if (nxCtx->nxPacket == NULL) {
        status = nx_tcp_socket_receive(nxCtx->nxSocket, &nxCtx->nxPacket,
                                       nxCtx->nxWait);
        if (status != NX_SUCCESS) {
            CYASSL_MSG("NetX Recv receive error");
            return CYASSL_CBIO_ERR_GENERAL;
        }
    }

    if (nxCtx->nxPacket) {
        status = nx_packet_length_get(nxCtx->nxPacket, &total);
        if (status != NX_SUCCESS) {
            CYASSL_MSG("NetX Recv length get error");
            return CYASSL_CBIO_ERR_GENERAL;
        }

        left = total - nxCtx->nxOffset;
        status = nx_packet_data_extract_offset(nxCtx->nxPacket, nxCtx->nxOffset,
                                               buf, sz, &copied);
        if (status != NX_SUCCESS) {
            CYASSL_MSG("NetX Recv data extract offset error");
            return CYASSL_CBIO_ERR_GENERAL;
        }

        nxCtx->nxOffset += copied;

        if (copied == left) {
            CYASSL_MSG("NetX Recv Drained packet");
            nx_packet_release(nxCtx->nxPacket);
            nxCtx->nxPacket = NULL;
            nxCtx->nxOffset = 0;
        }
    }

    return copied;
}
示例#2
0
// Network Headers & Variables & Functions
int s7g2_read(Network* n, unsigned char* buffer, int len, int timeout_ms)
{
  ULONG copied_idx = 0;
  Timer t;
  countdown_ms(&t , timeout_ms);
 
  while(len != 0){
    ULONG left_len;
    ULONG recv_len = 0;
    ULONG bytes_copied = 0;
    
    if(prepend_offset == 0){
      nx_tcp_socket_receive(&n->my_socket, &read_packet_ptr, timeout_ms);
    }
    nx_packet_length_get(read_packet_ptr, &recv_len);
    left_len = recv_len - prepend_offset;
    if(recv_len == 0){
        if(expired(&t))break;
    }

    
    if( left_len >= len ) {
      nx_packet_data_extract_offset(read_packet_ptr, prepend_offset, &buffer[copied_idx], len, &bytes_copied);
      if( left_len == bytes_copied ){
        prepend_offset = 0;
        nx_packet_release(read_packet_ptr);
        read_packet_ptr = NULL;
      } else {
        prepend_offset += bytes_copied;
      }
    } else {
      nx_packet_data_extract_offset(read_packet_ptr, prepend_offset, &buffer[copied_idx], left_len, &bytes_copied);
      prepend_offset = 0;
      nx_packet_release(read_packet_ptr);
      read_packet_ptr = NULL;
    }
    len -= bytes_copied;
    copied_idx += bytes_copied;
  }
  
  return copied_idx;
}