Sending Data Using a TCP Socket
Part of the FreeRTOS+TCP Networking Tutorial

[Note: This page does not describe the callback or zero copy interfaces, which are available for expert users.]

After a TCP socket has been created, configured, and bound it can be connected to a remote socket using the FreeRTOS_connect() API function, or it can accept connections from a remote socket. Once connected, data is sent to the remote socket using the FreeRTOS_send() API function.

The source code below shows a function that creates a socket, sends data to the socket, then gracefully shuts down and closes the socket. Note that this socket is not explicitly bound to a port number - causing it to be bound automatically inside the FreeRTOS_connect() API function. void vTCPSend( char 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; /* Set the IP address (192.168.0.50) and port (1500) of the remote socket to which this client socket will transmit. */ xRemoteAddress.sin_port = FreeRTOS_htons( 15000 ); xRemoteAddress.sin_addr = FreeRTOS_inet_addr_quick( 192, 168, 0 200 ); /* Create a socket. */ xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM,/* FREERTOS_SOCK_STREAM for TCP. */ FREERTOS_IPPROTO_TCP ); configASSERT( xSocket != FREERTOS_INVALID_SOCKET ); /* Connect to the remote socket. The socket has not previously been bound to a local port number so will get automatically bound to a local port inside the FreeRTOS_connect() function. */ if( FreeRTOS_connect( xSocket, &xRemoteAddress, sizeof( xRemoteAddress ) ) == 0 ) { /* Keep sending until the entire buffer has been sent. */ while( xAlreadyTransmitted < xTotalLengthToSend ) { /* How many bytes are left to send? */ xLenToSend = xTotalLengthToSend - xAlreadyTransmitted; xBytesSent = FreeRTOS_send( /* The socket being sent to. */ xSocket, /* The data being sent. */ &( pcBufferToTransmit[ xAlreadyTransmitted ] ), /* The remaining length of data to send. */ xLenToSend, /* ulFlags. */ 0 ); if( xBytesSent >= 0 ) { /* Data was sent successfully. */ xAlreadyTransmitted += xBytesSent; } else { /* Error - break out of the loop for graceful socket close. */ break; } } } /* Initiate graceful shutdown. */ FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR ); /* Wait for the socket to disconnect gracefully (indicated by FreeRTOS_recv() returning a FREERTOS_EINVAL error) before closing the socket. */ while( FreeRTOS_recv( xSocket, pcBufferToTransmit, xTotalLengthToSend, 0 ) >= 0 ) { /* Wait for shutdown to complete. If a receive block time is used then this delay will not be necessary as FreeRTOS_recv() will place the RTOS task into the Blocked state anyway. */ vTaskDelay( pdTICKS_TO_MS( 250 ) ); /* Note - real applications should implement a timeout here, not just loop forever. */ } /* The socket has shut down and is safe to close. */ FreeRTOS_closesocket( xSocket ); } Example using FreeRTOS_send()



<< Back to the RTOS TCP networking tutorial index