BSD tcp socket - send error with large data size

Hi,
I use Thread X with RA6M3.
FSP version 5.1


I want to send via tcp 119k byte using BSD wrapper, but:

If i try to send with a single call to send() function i get an error errno = 107 and the tcp socket disconnect.

bytes_to_send = 118784;

status = send(accepted_socket, ((const char*)p_SCmos), bytes_to_send, 0);

I thought it was a problem with the number of packet pool and their size but even setting the size to 1568 with 32 packets even trying to send only 15k bytes at a time I get an error.

The only wait to make it to go is to split with small send():

#define MAX_ONE_TIME_SEND_BYTES 1000

remaining_bytes = 118784

while(remaining_bytes > 0){

if(remaining_bytes > MAX_ONE_TIME_SEND_BYTES){

bytes_to_send = MAX_ONE_TIME_SEND_BYTES;

} else {

bytes_to_send = remaining_bytes;

}

status = send(accepted_socket, ((const char*)p_SCmos + (118784 - remaining_bytes)), bytes_to_send, 0);

if(status == -1){

SetLed(RED);

D(printf("Error sending body GetRawImage!\n"));

 }


What is the connection with  the BSD send() and packet pools? 
I thought that BSD send() took care of dividing my data to send it and not having to do it myself.
The only limit i think may be space due to the number of packets * packet size, but even if i use 1568 * 32 = 50176 a send with only 15k at a time it should work but it doesn't.
Can you explain to me why?

Parents Reply Children
  • Hello sir,

    Apologies for my delayed response.

    After checking your issue also internally:

    NetX BSD internally uses standard NetX API. Internally NetX BSD send will first call nx_packet_data_append to copy the message into a NetX packet, so if the message is larger than the size of a single packet, one or more packets will be allocated to satisfy the request. From the NetX DUO documentation for nx_packet_data_append ( github.com/.../chapter4.md ).

    Check also the description here:

    https://github.com/eclipse-threadx/rtos-docs/blob/main/rtos-docs/netx-duo/chapter4.md#description-66

    So the packet pool should be large enough to hold the complete message that is passed to BSD send.

    For example if we have a message with a total size 120KB and if we set the packet pool 16 packets (and the size of each packet is 1568 bytes), this is the place the send fails:

    Timeout has been set to 2 sec. If we set the packet pool to 120 the send completes successfully.

    Please find attached an example that runs on RA6M3, this requires a TCP server running on other machine to receive data  sent from RA6M3.

    FSP_5_3_0_EK_RA6M3_BSD_Socket_Large_Send.zip

    Hope it helps.

    Best Regards,

    IK

  • Thank you.
    However, by placing 120 packages we will occupy 120k of RAM, and I don't want to allocate so much ram just for the packet pool...
    1)So if I have to send a lot of bytes of data I always have to cut my payload by myself, otherwise send can't handle it on its own, I thought it would at least send what it can instead of giving an error and blocking completely...
    2)Another case: 32 packets of 1568 bytes (50176 bytes for the packet pool): sends of 40k do not always complete. If I set TCP Maximum TX Queue to 5 everything works(default is 20), is there an explanation?