请问我想要获取TCP-client socket端口的发送缓冲区应该怎么获取呢?如何修改发送缓冲区的大小?关于我使用MQTT-client例程来进行发送数据到上位机,但是我发现在使用sl_send()函数的时候出现了返回-11的情况,而且经过测试,十几分钟约出现丢包四五次的情况,这种情况应该如何解决呢?
以下是关于TCP socket的相关接口函数,请问这样编写代码是否有问题呢?数据发往上位机是通过调用tcp_client_send()来执行。
//****************************************************************************
int32_t tcp_client_disconnect(void)
{
_i16 status=0;
if (!is_connect)
{
//UART_PRINT("tcp_connect_close, error, tcp_client_socket < 0");
return -1;
}
UART_PRINT("tcp_connect_close, start close\n\r");
is_connect = FALSE;
/* Calling 'close' with the socket descriptor,
* once operation is finished. */
status = sl_Close(tcp_client_socket);
tcp_client_socket = -1;
ASSERT_ON_ERROR(status);
UART_PRINT("tcp_connect_close, close OK\n\r");
return 0;
}
int32_t tcp_client_connect( void)
{
SlSockAddr_t *sa;
sockAddr_t sAddr;
int32_t addrSize;
int32_t status;
int32_t nonBlocking;
ip_t ip_addr;
int32_t timeout;
ip_addr.ipv4 = wifi_config.server_ip;
uint16_t portNumber = wifi_config.server_port;
if (is_connect)
{
//UART_PRINT("tcp is already connected\n\r");
return -1;
}
UART_PRINT("tcp_connect_start, start connect\n\r");
/* filling the TCP server socket address */
sAddr.in4.sin_family = SL_AF_INET;
/* Since this is the client's side,
* we must know beforehand the IP address
* and the port of the server wer'e trying to connect.
*/
sAddr.in4.sin_port = sl_Htons((unsigned short)portNumber);
sAddr.in4.sin_addr.s_addr = sl_Htonl((unsigned int)ip_addr.ipv4);
sa = (SlSockAddr_t*)&sAddr.in4;
addrSize = sizeof(SlSockAddrIn_t);
/* Get socket descriptor - this would be the
* socket descriptor for the TCP session.
*/
tcp_client_socket = sl_Socket(sa->sa_family, SL_SOCK_STREAM, TCP_PROTOCOL_FLAGS);
ASSERT_ON_ERROR(tcp_client_socket);
nonBlocking = TRUE;
//timeout=30;
status = sl_SetSockOpt(tcp_client_socket, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &nonBlocking, sizeof(nonBlocking));
if(status < 0)
{
UART_PRINT("[line:%d, error:%d], socket = %d\n\r", __LINE__, status, tcp_client_socket);
usleep(1000000);
sl_Close(tcp_client_socket);
tcp_client_socket = -1;
return(-1);
}
status = -1;
/* Calling 'sl_Connect' followed by server's
* 'sl_Accept' would start session with
* the TCP server. */
while(status < 0)
{
status = sl_Connect(tcp_client_socket, sa, addrSize);
if(status == SL_ERROR_BSD_EALREADY)
{
usleep(1000000);
continue;
}
else if(status < 0)
{
UART_PRINT("[line:%d, error:%d], socket = %d\n\r", __LINE__, status, tcp_client_socket);
usleep(100000);
sl_Close(tcp_client_socket);
tcp_client_socket = -1;
return(-1);
}
}
is_connect = TRUE;
UART_PRINT("tcp_connect_start, connect OK,tcp_client_socket = %d\n\r ", tcp_client_socket);
return 0;
}
extern mqd_t appQueue ;
uint8_t n=0;
int32_t tcp_client_send(uint8_t* data_buf, uint16_t buf_len)
{
_u16 temp=0;
int32_t status=0;
//UART_PRINT("tcp_client_send, send start\n\r");
if (!is_connect)
{
UART_PRINT("tcp is disconnected\n\r");
return -1;
}
/* Send packets to the server */
status = sl_Send(tcp_client_socket, data_buf, buf_len, 0); //返回的是buf_len
// UART_PRINT("MinTxPayloadSize = %d\r\n",g_pCB->FlowContCB.MinTxPayloadSize);
// UART_PRINT("TxPoolCnt = %d\r\n",g_pCB->FlowContCB.TxPoolCnt);
while(status != buf_len) //死循环
{
n++;
status = sl_Send(tcp_client_socket, data_buf, buf_len, 0);
if(n==5)
{
// usleep(5);//需不需要呢?
n=0;
status = sl_Send(tcp_client_socket, data_buf, buf_len, 0);
if(status != buf_len)
break;
}
}
if(status == SL_ERROR_BSD_EAGAIN)
{
status = sl_Send(tcp_client_socket, data_buf, buf_len, 0);
}
else if(status < 0)
{
UART_PRINT("[line:%d, error:%d]\n\r", __LINE__, status);
usleep(100000);
tcp_client_disconnect();
return(-1);
}
else
{
// UART_PRINT("Tcp client Sent %u packets successfully\n\r", status);
}
return 0;
}
int32_t tcp_client_receive(uint8_t* data_buf, uint16_t* receive_len)
{
int32_t status;
//UART_PRINT("tcp_client_receive, receive start\n\r");
if (!is_connect)
{
//UART_PRINT("tcp is disconnected\n\r");
return -1;
}
status = sl_Recv(tcp_client_socket, data_buf, MAX_BUF_SIZE, 0);
if(status == SL_ERROR_BSD_EAGAIN)
{
}
else if(status < 0)
{
UART_PRINT("[line:%d, error:%d]\n\r", __LINE__, status);
usleep(100000);
tcp_client_disconnect();
return(-1);
}
else if(status == 0)
{
UART_PRINT("TCP Server closed the connection\n\r");
usleep(100000);
tcp_client_disconnect();
return(-1);
}
else
{
//UART_PRINT("Tcp client Receive %u packets successfully\n\r", status);
}
*receive_len = (uint16_t)status;
return 0;
}
bool tcp_is_connected(void)
{
return is_connect;
}
还有就是,为什么我DEBUG的时候g_pCB->FlowContCB.MinTxPayloadSize是有值的,但是打印的时候却全是0呢?
UART_PRINT("MinTxPayloadSize = %d\r\n",g_pCB->FlowContCB.MinTxPayloadSize);
请尽快给与解答,急~谢谢
