如果使用的 lOptionName 值无效,则返回 -pdFREERTOS_ERRNO_EINVAL,
否则返回 0。
(按照伯克利套接字标准,返回 0 表示成功,
而根据 FreeRTOS 标准,0 表示失败! )
#include "FreeRTOS_sockets.h"
Socket_t xCreateASocket( TickType_t xReceiveTimeout_ms,
TickType_t xSendTimeout_ms,
int32_t iUseChecksum )
{
Socket_t xSocket;
xSocket = FreeRTOS_socket( FREERTOS_AF_INET4,
FREERTOS_SOCK_DGRAM,
FREERTOS_IPPROTO_UDP );
if( xSocket != FREERTOS_INVALID_SOCKET )
{
xReceiveTimeout_ms /= portTICK_PERIOD_MS;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_RCVTIMEO,
&xReceiveTimeout_ms,
0 );
xSendTimeout_ms /= portTICK_PERIOD_MS;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_SNDTIMEO,
&xSendTimeout_ms,
0 );
if( iUseChecksum == pdFALSE )
{
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_UDPCKSUM_OUT,
NULL,
0 );
}
else
{
}
}
return xSocket;
}
Example use of the FreeRTOS_setsockopt() API function
lOptionName 值
|
说明
|
FREERTOS_SO_RCVTIMEO
|
设置接收超时值
(在 FreeRTOS_recvfrom()
使用 UDP 套接字进行调用,或
FreeRTOS_recv()
使用 TCP 套接字进行调用时)。
如果 lOptionName 为 FREERTOS_SO_RECTIMEO,
pvOptionValue 必须指向
TickType_t 类型的变量。
指定以 tick 为单位的超时值
以滴答 (tick) 为单位。 要将毫秒为单位的时间转换为 tick 为单位的时间,
可将毫秒为单位的时间除以
portTICK_PERIOD_MS,或
使用 pdMS_TO_TICKS() 宏。
|
FREERTOS_SO_SNDTIMEO
|
设置传输超时
(在 FreeRTOS_send()
与 TCP 套接字一起使用,或
FreeRTOS_sendto()
与 UDP 套接字一起使用时。)
如果 lOptionName 为 FREERTOS_SO_SNDTIMEO,
pvOptionValue 必须指向
TickType_t 类型的变量。
指定以 tick 为单位的超时值
以滴答 (tick) 为单位。 要将毫秒为单位的时间转换为 tick 为单位的时间,
可将毫秒为单位的时间除以
portTICK_PERIOD_MS,或
使用 pdMS_TO_TICKS() 宏。
|
FREERTOS_SO_UDPCKSUM_OUT
|
仅对 UDP 套接字有效。
打开或关闭传出
UDP 数据包的校验和值的生成。
如果 lOptionName 为 FREERTOS_SO_UDPCKSUM_OUT,
并且 lOptionValue 为 NULL (0),那么传出 UDP
数据包的校验和将始终设置为
0。
如果 lOptionName 为 FREERTOS_SO_UDPCKSUM_OUT,
并且 lOptionValue 为除 NULL (0) 以外的任何值,
那么传出 UDP 数据包将包括有效的校验和值
。
|
FREERTOS_SO_SET_SEMAPHORE
|
仅在
ipconfigSOCKET_HAS_USER_SEMAPHORE
在 FreeRTOSIPConfig.h 中设置为 1 时有效。
借助此选项,可将对信号量的引用
传递给套接字。 然后, TCP/IP RTOS 任务
将在以下任何事件发生时提供信号量:
-
新数据到达
-
传输数据后,新的传输缓冲区空间可用时
-
传出 TCP 连接已成功
-
新客户端已连接到 TCP 套接字
-
TCP 连接已关闭或重置
用法示例:
SemaphoreHandle_t xSemaphore;
xSemaphore = xSemaphoreCreateBinary();
if( xSemaphore != NULL )
{
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_SET_SEMAPHORE,
( void * )&xSemaphore,
sizeof( xSemaphore ) );
SemaphoreHandle_t xNoSem = NULL;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_SET_SEMAPHORE,
( void * ) &xNoSem,
sizeof( xNoSem ) );
vSemaphoreDelete( xSemaphore );
}
Example of passing a semaphore to a socket
|
FREERTOS_SO_RCVBUF
|
仅对 TCP 套接字有效。
设置接收缓冲区的大小。
理想情况下,该大小应设置为
滑动窗口的两倍。
该参数只能设置为在正在创建的套接字和正在套接字上接收的数据
之间的值,因为
接收缓冲区的大小会在创建缓冲区后固定。
如果 lOptionName 为 FREERTOS_SO_RCVBUF,
则 pvOptionValue 必须指向
int32_t 类型的变量。
接收缓冲区大小以字节为单位。 在内部,
指定的大小将四舍五入到
最接近的 ipconfigTCP_MSS 大小
的倍数。 例如,如果 ipconfigTCP_MSS 为 500,
将缓冲区大小设置为 400,会指定缓冲区大小为 500 (1 * ipconfigTCP_MSS);
将缓冲区大小设置为 500,
会指定缓冲区大小为 500 (1 * ipconfigTCP_MSS);将缓冲区大小设置为 510,
会指定缓冲区大小为 1000 (2 * ipconfigTCP_MSS)。
|
FREERTOS_SO_SNDBUF
|
仅对 TCP 套接字有效。
设置发送缓冲区的大小。
此参数与数据包的大小或滑动
窗口无关,只设置缓冲区的大小。
该参数只能设置为在正在创建的套接字和正在套接字上发送的数据
之间的值,因为
发送缓冲区的大小会在创建缓冲区后固定。
如果 lOptionName 为 FREERTOS_SO_SNDBUF,
则 pvOptionValue 必须指向
int32_t 类型的变量。
接收缓冲区大小以字节为单位。 在内部,
指定的大小将四舍五入到
最接近的 ipconfigTCP_MSS 大小
的倍数。 例如,如果 ipconfigTCP_MSS 为 500,
将缓冲区大小设置为 400,会指定缓冲区大小为 500 (1 * ipconfigTCP_MSS);
将缓冲区大小设置为 500,
会指定缓冲区大小为 500 (1 * ipconfigTCP_MSS);将缓冲区大小设置为 510,
会指定缓冲区大小为 1000 (2 * ipconfigTCP_MSS)。
|
FREERTOS_SO_WIN_PROPERTIES
|
仅限高级用户。
仅对 TCP 套接字有效。
一次调用即可设置接收缓冲区、
接收滑动窗口、
发送缓冲区以及发送滑动窗口的大小。
缓冲区和滑动窗口大小只能设置为
正在创建的套接字和发送到套接字
或从套接字接收的任何数据之间的值。
用法示例:
WinProperties_t xWinProps;
xWinProps.lTxBufSize = 4 * ipconfigTCP_MSS;
xWinProps.lTxWinSize = 2;
xWinProps.lRxBufSize = 4 * ipconfigTCP_MSS;
xWinProps.lRxWinSize = 2;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_WIN_PROPERTIES,
( void * ) &xWinProps,
sizeof( xWinProps ) );
Example of setting the buffer and sliding window sizes
|
FREERTOS_SO_REUSE_LISTEN_SOCKET
|
仅对 TCP 套接字有效。
默认情况下,监听
套接字将创建一个新的套接字来处理任何接受的连接。
FREERTOS_SO_REUSE_LISTEN_SOCKET 可用于更改此行为,
因此接受的连接由侦听
套接字本身处理。
如果 lOptionName 为 FREERTOS_SO_REUSE_LISTEN_SOCKET,
则 pvOptionValue 必须指向
BaseType_t 类型的变量,该变量设置为 1 表示
侦听套接字应重新用于传入连接,或设置为 0 表示
侦听套接字应创建一个新套接字
来处理每个传入连接。
对于可重复使用的套接字,可选择调用 FreeRTOS_accept()。
此外,还可调用 FreeRTOS_connect_connected() 来确定套接字是否
已连接。 建议调用 FreeRTOS_accept(),因为它标志着
从未连接更改为已连接。
成功后,FreeRTOS_accept() 返回对
已连接的父套接字的引用。 现在标记为已接受
并停止侦听新连接。
连接结束时,必须通过调用
FreeRTOS_closesocket 关闭套接字。
之后,可创建一个新套接字并将其绑定到同一
端口。
用法示例:
BaseType_t xReuseSocket = pdTRUE;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_REUSE_LISTEN_SOCKET,
( void * ) &xReuseSocket,
sizeof( xReuseSocket ) );
Example of setting the re-use option to true
|
FREERTOS_SO_CLOSE_AFTER_SEND
|
仅限高级用户。
仅对 TCP 套接字有效。
利用 FREERTOS_SO_CLOSE_AFTER_SEND TCP,可在传递
最后一个数据后立即关闭套接字。 例如,
在发送文件的 FTP 中,此选项很有用。
最后一次调用 FreeRTOS_send() 之前,设置此选项,
可确保堆栈最后一个数据包
必须包含 FIN 标志。 堆栈将确保
仅在传递最后一个字节并得到
对等方确认后才关闭连接。
如果 lOptionName 为 FREERTOS_SO_CLOSE_AFTER_SEND,
则 pvOptionValue 必须指向
BaseType_t 类型的变量,该变量设置为 1 表示
在发送最后一个数据后应关闭套接字,或设置 0 表示
套接字应使用其默认行为
保持套接字打开状态,直到由任何一个对等方显式打开。
用法示例:
BaseType_t xCloseAfterNextSend = pdTRUE;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_CLOSE_AFTER_SEND,
( void * ) &xCloseAfterNextSend,
sizeof( xCloseAfterNextSend ) );
Example of using the FREERTOS_SO_CLOSE_AFTER_SEND parameter
|
FREERTOS_SO_SET_FULL_SIZE
|
仅限高级用户。
仅对 TCP 套接字有效。
使用 FREERTOS_SO_SET_FULL_SIZE 选项,可指示 TCP/IP 堆栈
不从套接字发送任何数据,直到有至少
一个完整的 MSS
大小的数据准备发送就绪。 此选项
可用于提高性能,但必须谨慎使用。
此选项不会超时,因此请确保
在最后一次发送时关闭该选项,以便将最后一个字节
(小于 MSS)传送出去。
如果 lOptionName 为 FREERTOS_SO_SET_FULL_SIZE,
则 pvOptionValue 必须指向
BaseType_t 类型的变量,该变量设置为 1 表示
仅应在至少有 MSS 字节等待传送时
发送套接字,或设置为 0 表示
套接字应使用其默认行为。
|
FREERTOS_SO_STOP_RX
|
仅限高级用户。
仅对 TCP 套接字有效。
TCP 套接字将不断向其对等方
通告窗口大小,因此对等方等待确认前
可以明确发送多少字节。这一切都是自动发生的,
可设置低水位线和高水位线。
使用 FREERTOS_SO_STOP_RX,可强制套接字通告零窗口,
使套接字暂时停止接收
数据。
如果 lOptionName 为 FREERTOS_SO_STOP_RX,
则 pvOptionValue 必须指向
BaseType_t 类型的变量,该变量设置为 1 表示
套接字应通告窗口大小为 0,或设置 0 表示
套接字应使用其默认行为。
BaseType_t xValue = pdTRUE;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_STOP_RX,
( void * ) &xValue,
sizeof( xValue ) );
{
}
xValue = pdFALSE;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_STOP_RX,
( void * ) &xValue,
sizeof( xValue ) );
Example of using the FREERTOS_SO_STOP_RX parameter
|
FREERTOS_SO_UDP_MAX_RX_PACKETS
|
仅对 UDP 套接字有效,而且需要将
ipconfigUDP_MAX_RX_PACKETS
在 FreeRTOSIPConfig.h 中设置为 1。
参数 ipconfig UDP_MAX_RX_PACKETS 可以
限制存储在一个 UDP 套接字中的
最大数据包数。此选项可以更改
单个套接字的此限制
如果 lOptionName 为 FREERTOS_SO_UDP_MAX_RX_PACKETS,
则 pvOptionValue 必须指向
一个 BaseType_t 类型的变量,该变量包含
可以在 UDP 套接字上排队的最大 RX 数据包数。
BaseType_t xValue = 10;
FreeRTOS_setsockopt( xSocket,
0,
FREERTOS_SO_UDP_MAX_RX_PACKETS,
( void * ) &xValue,
sizeof( xValue ) );
Example of using the FREERTOS_SO_UDP_MAX_RX_PACKETS parameter
|
FREERTOS_SO_TCP_CONNECT_HANDLER
|
仅限高级用户。
仅对 TCP 套接字有效。
存储要在
TCP 套接字上的连接和断开事件上调用的函数地址。
|
FREERTOS_SO_TCP_RECV_HANDLER
|
仅限高级用户。
仅对 TCP 套接字有效。
存储要在
TCP 套接字上接收数据时要调用的函数地址。
|
FREERTOS_SO_TCP_SENT_HANDLER
|
仅限高级用户。
仅对 TCP 套接字有效。
存储发送到
TCP 套接字的数据已交付并由对等方确认时要调用的函数地址。
|
FREERTOS_SO_UDP_RECV_HANDLER
|
仅限高级用户。
仅对 UDP 套接字有效。
存储在
UDP 套接字上接收到数据后立即调用的函数地址。
|
FREERTOS_SO_UDP_SENT_HANDLER
|
仅限高级用户。
仅对 UDP 套接字有效。
存储
数据发送到 UDP 套接字时要立即调用的函数地址。
|
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.