|
最近在调试stm32h7的lwip协议栈中用socket写一个tcp服务器端。
本来是通了的,为了防阻塞接收发送卡死,给connect加timeout的时候发现,只要写了设置timeout语句lwip_setsockopt,就会在debug的时候在执行到accept的时候自动停在bkpt汇编指令处。
此时还没有运行到lwip_setsockopt。真的好诡异。求大佬解惑啊!
tcp任务如下。
void Start_Tcp_Connect_Task(void *argument)
{
/* USER CODE BEGIN Start_Tcp_Connect_Task */
/* Infinite loop */
//netconn_set_nonblocking(conn,1);
while(!eth_ok_flag)
{
osDelay(1);
}
struct sockaddr_in server_addr; //服务器地址
struct sockaddr_in conn_addr; //连接地址
int sock_fd; //服务器的 socked
int sock_conn; // 请求的 socked
socklen_t addr_len; // 地址长度
int err;
int length;
int send_timeout=5000;
int recv_timeout=5000;
sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //建立一个新的socket连接
memset(&server_addr, 0, sizeof(server_addr)); //将服务器地址清空
server_addr.sin_family = AF_INET; //地址家族
server_addr.sin_addr.s_addr =htonl(INADDR_ANY); //注意转化为网络字节序
server_addr.sin_port = htons(6000);
err = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); //建立绑定
if (err < 0) //如果绑定失败则关闭套接字
{
closesocket(sock_fd); //关闭套接字
}
err = listen(sock_fd, 1); //监听连接请求
if (err < 0) //如果监听失败则关闭套接字
{
closesocket(sock_fd); //关闭套接字
}
addr_len = sizeof(struct sockaddr_in); //将链接地址赋值给addr_len
sock_conn = accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
send(sock_conn, "connect success!\n\r", 21, 0);
for(;;)
{
if(sock_conn<0) //状态小于0代表连接故障,此时关闭套接字
{
closesocket(sock_fd);
}
else
{
lwip_setsockopt(sock_conn,SOL_SOCKET,SO_SNDTIMEO,&send_timeout,sizeof(send_timeout));
lwip_setsockopt(sock_conn,SOL_SOCKET,SO_RCVTIMEO,&recv_timeout,sizeof(recv_timeout));
memset(data_buffer, 0, sizeof(data_buffer)); //清空接收Buff
length = recv(sock_conn, (unsigned int *)data_buffer, 100, 0);
if(length>0)
{
for(uint8_t i=0;i<length;i++)
{
tcp_server_recvbuf[i]=data_buffer[i];
}
send(sock_conn,data_buffer,length, 0);
}
else
{
closesocket(sock_conn);
}
}
osDelay(1);
}
/* USER CODE END Start_Tcp_Connect_Task */
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|