[注意: 本页不介绍供专家用户使用的回调或零拷贝接口
。]
TCP 套接字被
创建、配置并绑定后,
可使用
FreeRTOS_connect() API
函数连接到远程套接字,或接受
来自远程套接字的连接。 一旦连接,
数据将通过
FreeRTOS_send() API
的功能。
以下源代码显示了创建套接字、
向套接字发送数据然后优雅地关闭套接字的函数。显示的是 IPv4 和 IPv6 用例
。注意
此套接字未显式绑定到端口号——导致它在
FreeRTOS_connect() API 函数时,传递一个指向中断处理函数的指针作为 xFunctionToPend 的参数。
MTU 为 1526 字节开始的 IPv4
void vTCPSend( char *pcBufferToTransmit, const size_t xTotalLengthToSend )
{
Socket_t xSocket;
struct freertos_sockaddr xRemoteAddress;
BaseType_t xAlreadyTransmitted = 0, xBytesSent = 0;
TaskHandle_t xRxTask = NULL;
size_t xLenToSend;
xRemoteAddress.sin_port = FreeRTOS_htons( 1500 );
xRemoteAddress.sin_addr = FreeRTOS_inet_addr_quick( 192, 168, 0, 200 );
xSocket = FreeRTOS_socket( FREERTOS_AF_INET,
FREERTOS_SOCK_STREAM,
FREERTOS_IPPROTO_TCP );
configASSERT( xSocket != FREERTOS_INVALID_SOCKET );
if( FreeRTOS_connect( xSocket, &xRemoteAddress, sizeof( xRemoteAddress ) ) == 0 )
{
while( xAlreadyTransmitted < xTotalLengthToSend )
{
xLenToSend = xTotalLengthToSend - xAlreadyTransmitted;
xBytesSent = FreeRTOS_send(
xSocket,
&( pcBufferToTransmit[ xAlreadyTransmitted ] ),
xLenToSend,
0 );
if( xBytesSent >= 0 )
{
xAlreadyTransmitted += xBytesSent;
}
else
{
break;
}
}
}
FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR );
while( FreeRTOS_recv( xSocket, pcBufferToTransmit, xTotalLengthToSend, 0 ) >= 0 )
{
vTaskDelay( pdTICKS_TO_MS( 250 ) );
}
FreeRTOS_closesocket( xSocket );
}
使用 FreeRTOS_send() 的示例
IPv6 -
void vTCPSend( char *pcBufferToTransmit, const size_t xTotalLengthToSend )
{
Socket_t xSocket;
struct freertos_sockaddr xRemoteAddress;
BaseType_t xAlreadyTransmitted = 0, xBytesSent = 0;
TaskHandle_t xRxTask = NULL;
size_t xLenToSend;
xRemoteAddress.sin_port = FreeRTOS_htons( 1500 );
FreeRTOS_inet_pton6( "2001:470:ed44::9c08:38cc:599f:f62a", (void *) xRemoteAddress.sin_address.xIP_IPv6.ucBytes )
xSocket = FreeRTOS_socket( FREERTOS_AF_INET6,
FREERTOS_SOCK_STREAM,
FREERTOS_IPPROTO_TCP );
configASSERT( xSocket != FREERTOS_INVALID_SOCKET );
if( FreeRTOS_connect( xSocket, &xRemoteAddress, sizeof( xRemoteAddress ) ) == 0 )
{
while( xAlreadyTransmitted < xTotalLengthToSend )
{
xLenToSend = xTotalLengthToSend - xAlreadyTransmitted;
xBytesSent = FreeRTOS_send(
xSocket,
&( pcBufferToTransmit[ xAlreadyTransmitted ] ),
xLenToSend,
/* ulFlags. */
0 );
if( xBytesSent >= 0 )
{
xAlreadyTransmitted += xBytesSent;
}
else
{
break;
}
}
}
FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR );
while( FreeRTOS_recv( xSocket, pcBufferToTransmit, xTotalLengthToSend, 0 ) >= 0 )
{
vTaskDelay( pdTICKS_TO_MS( 250 ) );
}
FreeRTOS_closesocket( xSocket );
}
使用 FreeRTOS_send() 的示例
<<
返回 RTOS TCP 网络教程索引
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.