heinbali01 wrote on Thursday, January 18, 2018:
Here is some more information about the behaviour of
FreeRTOS_connect() starts by looking-up the MAC-address of the target. If the IP-address has an entry in the ARP table, this happens very quickly. When an ARP look-up is needed, it will take at least half a second.
The number of attempts ( sending a
SYN ), and the time-outs between them are fixated in the library source code:
0.000 sec SYN-1
3.000 sec SYN-2
9.000 sec SYN-3
You can either
connect() to a remote device in a blocking way, or by polling.
Blocking: the socket option
RCVTIMEO determines the maximum time that
FreeRTOS_connect() will wait for a connection:
/* Wait at most 5 seconds. */
TickType_t xTimeout = pdMS_TO_TICKS( 5000ul );
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xTimeout, sizeof( BaseType_t ) );
Mind that a useful value for
RCVTIMEO is either +/- 2, 5, or 11 seconds.
FreeRTOS_select(), a successful
FreeRTOS_connect() will be notified as a
eSELECT_WRITE event. A successful acceptance of a new client triggers a
You can find complete examples of using
FreeRTOS_select() in the “protocols” directory ( FTP and HTTP server ).
When using “non-blocking” ways to connect, you can call this function to see if a connection was established:
/* returns pdTRUE if TCP socket is connected */
BaseType_t FreeRTOS_issocketconnected( Socket_t xSocket );
You may also call
FreeRTOS_recv() before the connection is established, to see any errors that might occurs.
If you do not want to block on
FreeRTOS_connect(), and you don’t want to use
FreeRTOS_select(), there is a third way. Let your task block on a semaphore, and bind that semaphore to all sockets that it owns:
/* Define this in you FreeRTOSIPConfig.h */
#define ipconfigSOCKET_HAS_USER_SEMAPHORE 1
/* Bind a semaphore to a socket. */
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xMySemaphore, sizeof( xMySemaphore ) );
The semaphore will be given to for every event of interest: RX, TX, connect succeeded, acceptance of a client.
The same semaphore can be “bound” to many sockets of all types.
I attached a working “hello world” example of this method: “socket_using_semaphore.c”