FreeRTOS_sockets.h
void FreeRTOS_FD_CLR( Socket_t xSocket, SocketSet_t xSocketSet, BaseType_t xBitsToClear );
套接字集中的套接字具有多个相关联的相关事件位。
相关事件位置位将会使套接字解除
FreeRTOS_select() 调用的阻塞状态。 相关事件位使用
FreeRTOS_FD_SET()
API 函数实现置位,而使用 FreeRTOS_FD_CLR() API 函数实现清零。 如果
所有事件位均已清零,则该套接字会从套接字集中移除
。
必须
FreeRTOSIPConfig.h 中设置为 1,
才能使用 FreeRTOS_FD_CLR() 。
每个套接字成员都有自己的事件位集,可以是一个位元
或以下值的组合:
eSELECT_READ
|
对于正在读取数据的套接字,
只要套接字包含未读数据,
eSELECT_READ 事件就会在套接字中处于挂起状态。
对于正在监听新连接的套接字,
每次接收到新连接时,
eSELECT_READ 事件就会挂起。
|
eSELECT_WRITE
|
只要套接字有写入空间,
eSELECT_WRITE 事件就会一直处于挂起状态。
如果 TCP 套接字主动连接到 pear,
则在建立连接后,
会立即触发 eSELECT_WRITE 事件。
当 eSELECT_WRITE 事件被挂起后,就应将其禁用,
或者调用方应对套接字写入足够数据,
以完全填充传输缓冲区——
否则,将不会清除挂起的 eSELECT_WRITE 事件。
|
eSELECT_EXCEPT
|
如果套接字断开连接,则 eSELECT_EXCEPT 事件会进入挂起状态
。
|
eSELECT_INTR
|
如果在调用过程中使用 FreeRTOS_SignalSocket() 或
FreeRTOS_SignalSocketFromISR() 向任何套接字发出信号,则返回 eSELECT_INTR。请注意,
只有在定义了 ipconfigSUPPORT_SIGNALS 的情况下才会触发。
|
参数:
xSocket
|
具有一个已清零相关位或正从套接字集中移除的套接字
。
|
xSocketSet
|
套接字成员所属的套接字集。
|
xBitsToClear
|
应清零的位,使用 'eSELECT_ALL' 将所有位清零
并从套接字集中移除该套接字。
|
返回:
无效
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "FreeRTOS_IP.h"
#include "FreeRTOS_Sockets.h"
void vConnectExample( )
{
Socket_t xSocket;
struct freertos_sockaddr xEchoServerAddress;
const TickType_t xZeroTimeOut = 0;
SocketSet_t xSocketSet;
xSocket = FreeRTOS_socket( FREERTOS_AF_INET4, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
xSocketSet = FreeRTOS_CreateSocketSet()( );
FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_WRITE );
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xZeroTimeOut, sizeof( xZeroTimeOut ) );
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xZeroTimeOut, sizeof( xZeroTimeOut ) );
xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT );
xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0,
configECHO_SERVER_ADDR1,
configECHO_SERVER_ADDR2,
configECHO_SERVER_ADDR3 );
FreeRTOS_connect( xSocket, &xEchoServerAddress, sizeof( xEchoServerAddress ) );
if( FreeRTOS_select( xSocketSet, 30000 ) != 0 )
{
BaseType_t xMask = FreeRTOS_FD_ISSET ( xSocket, xSocketSet );
if( xMask != 0 )
{
FreeRTOS_FD_CLR( xSocket, xSocketSet, eSELECT_WRITE );
FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ );
}
}
}
Example use of the FreeRTOS_FD_SET / FD_CLR / FD_ISSET() API functions
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.