Hi there, I’m trying to enstablish a Client/Server communication. I have 2 AEK-COM-10BASET boards connected by ethernet.
These boards embeds 2 ethernet PHY transceivers, which I will name “eth0” and “eth1”:
The network_cfg.h for both boards defines these IPs:
#define SPC5_ETH0_IP_ADDR “192.168.1.1”
#define SPC5_ETH1_IP_ADDR “192.168.1.2”
This is my server main task:
void remote_connect_and_listenTask( void *pvParam ){
const BaseType_t xBacklog = 10; //massimo numero di connessioni 10
BaseType_t ret_bind, ret_listen;
Socket_t xListeningSocket, xConnectedSocket;
struct freertos_sockaddr xBindAddress;
struct freertos_sockaddr connected_client;
socklen_t connected_client_size = sizeof(connected_client);
static const TickType_t acpt_tout = pdMS_TO_TICKS(1000);
const char *pcInterfaceName = "eth0"; //test8650 // eth0=8670
uint8_t received_eth_msg[6];
char* cBuffer;
BaseType_t xReceivedBytes, result;
xListeningSocket = FreeRTOS_socket(FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP);
if (xListeningSocket != FREERTOS_INVALID_SOCKET)
{
FreeRTOS_setsockopt( xListeningSocket, 0, FREERTOS_SO_BINDTODEVICE, pcInterfaceName, strlen(pcInterfaceName));
FreeRTOS_setsockopt( xListeningSocket, 0, FREERTOS_SO_SNDTIMEO, &acpt_tout, sizeof(acpt_tout));
FreeRTOS_setsockopt( xListeningSocket, 0, FREERTOS_SO_RCVTIMEO, &acpt_tout, sizeof(acpt_tout));
xBindAddress.sin_port = FreeRTOS_htons( ETH_PORT );
xBindAddress.sin_addr = FreeRTOS_inet_addr(SPC5_ETH0_IP_ADDR);
//connected_client.sin_port = FreeRTOS_htons( ETH_PORT );
//connected_client.sin_addr = FreeRTOS_inet_addr("192.168.1.2");
ret_bind = FreeRTOS_bind( xListeningSocket, &xBindAddress, sizeof( xBindAddress ) ); //bind to 5555
/* Ascolto delle connessioni */
ret_listen = FreeRTOS_listen( xListeningSocket, xBacklog );
//configASSERT(ret == 0);
for( ;; )
{/* Accetta una connessione */
xConnectedSocket = FreeRTOS_accept( xListeningSocket, &connected_client, &connected_client_size );
if (xConnectedSocket != FREERTOS_INVALID_SOCKET)
{/* Ricezione dei dati */
xReceivedBytes = FreeRTOS_recv(xConnectedSocket, &received_eth_msg, 6, 0 );
if( xReceivedBytes > 0 )
{ cBuffer = &received_eth_msg;
//px_rcv_eth_msg = &received_eth_msg;
//result = xQueueSend(schedulingMessageQueue, (void*)(&px_rcv_eth_msg), 0);
xTaskNotifyGive(schedulerTaskHandler);
}
}
}
}
}
and This is my CLIENT task, installed in the other board:
void init_socket_comm_Task ( void *pvParam ){
(void)pvParam;
static const TickType_t acpt_tout = pdMS_TO_TICKS(5000); // Timeout di 20 secondi
BaseType_t ret_socket, ret_connect, ret_addr;
Socket_t xClientSocket;
const char *pcInterfaceName = "eth1"; //8650
struct freertos_sockaddr xServerAddress, xClientAddress;
uint8_t cBuffer[6] = {1,2,3,4,5,9};
BaseType_t xSentBytes;
xClientSocket = FreeRTOS_socket(FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP);
// FreeRTOS_setsockopt(xClientSocket, 0, FREERTOS_SO_BINDTODEVICE, pcInterfaceName, strlen(pcInterfaceName));
FreeRTOS_setsockopt(xClientSocket, 0, FREERTOS_SO_SNDTIMEO, &acpt_tout, sizeof(acpt_tout));
FreeRTOS_setsockopt(xClientSocket, 0, FREERTOS_SO_RCVTIMEO, &acpt_tout, sizeof(acpt_tout));
xServerAddress.sin_len = sizeof xServerAddress;
xServerAddress.sin_family = FREERTOS_AF_INET;
xServerAddress.sin_port = FreeRTOS_htons(ETH_PORT);
xServerAddress.sin_addr = FreeRTOS_inet_addr(SPC5_ETH0_IP_ADDR ); // Indirizzo IP del server
//ret_socket = FreeRTOS_bind( xClientSocket, &xServerAddress, sizeof( xServerAddress ) );
//ret_addr = FreeRTOS_GetRemoteAddress(xClientSocket, &xClientAddress );
do {
vTaskDelay(pdMS_TO_TICKS(750)); // Attende prima di ritentare
ret_connect = FreeRTOS_connect(xClientSocket, &xServerAddress, sizeof(xServerAddress));
} while (ret_connect < 0);
for (;;)
{
xSentBytes = FreeRTOS_send(xClientSocket, cBuffer, strlen(cBuffer), 0);
//configASSERT(xSentBytes == strlen(cBuffer));
vTaskDelay(pdMS_TO_TICKS(1000)); // Invia il messaggio ogni 500 ms
} }
The BINDTODEVICE sockopt is an added opt which does the following:
case FREERTOS_SO_BINDTODEVICE:
{/* Bind this socket to a particular device like "eth0". */
const char * pxIfName = ( const char * ) pvOptionValue;
if( pxIfName == NULL )
{
xReturn = -pdFREERTOS_ERRNO_EINVAL;
}else{
NetworkInterface_t * pxNetIf = FreeRTOS_GetIfByName( pxIfName );
if( pxNetIf == NULL)
{
xReturn = -pdFREERTOS_ERRNO_EINVAL;
}else{
pxSocket->ulLocalAddress = pxNetIf->ulDefaultIPAddress;
xReturn = 0;
}}}
break;
My nodes does not communicate, because Server Recv always returns Error:-22
Does anybody see any errors?