/** * recv_data - 非阻塞接收固定大小数据,在超时时间(timeout)内不接收完不返回 * * @sockfd [in] 套接字 * @buf [in] 接收数据缓存 * @size [in] 接收数据大小 * @timeout [in] 接收的超时时间(秒),默认为3 * * return: * == 0 成功 * != 0 错误码,error.h的错误码 * */ int rcv_non_block( int sockfd, char* buf, int size, int timeout /*= 3*/) { int rsize = 0; int flag, errorcode, res; while ( rsize != size ) { errorcode = recv( sockfd, buf + rsize, size - rsize, 0 ); if ( errorcode == 0 ) return BUILD_ERROR(_OSerrno(), E_RCV); else if ( errorcode == SOCKET_ERROR ) { errorcode = GetLastError(); if ( WSAEWOULDBLOCK == errorcode ) { flag = 0x1; res = select_socket( &sockfd, &flag, 1, timeout, 0 ); if ( 0 != res ) { return res; } else continue; } return BUILD_ERROR(errorcode, 0); } rsize += errorcode; } return 0; }
static AGESA_STATUS board_ReadSpd (UINT32 Func, UINTN Data, VOID *ConfigPtr) { AGESA_STATUS Status; #ifdef __PRE_RAM__ if (ConfigPtr == NULL) return AGESA_ERROR; select_socket(((AGESA_READ_SPD_PARAMS *)ConfigPtr)->SocketId); Status = agesa_ReadSpd (Func, Data, ConfigPtr); restore_socket(); #else Status = AGESA_UNSUPPORTED; #endif return Status; }