gpt4 book ai didi

c - TCP 服务器似乎无法在 LWIP+FreeRTOS 中工作

转载 作者:可可西里 更新时间:2023-11-01 02:34:14 35 4
gpt4 key购买 nike

我使用 lwip+freeRTOS 在我的一个嵌入式设备中开发了一个 tcp 服务器。现在这是我使用我的设备(我们将其命名为 lwipDevice)与其他设备(其他设备具有 Linux 系统,我们将其命名为 LinuxDevice)进行通信的流程

  1. 将 UDP 数据包从 lwipDevice 发送到 LinuxDevice 以启动我已准备好共享我的信息。

  2. 现在LinuxDevice成功识别此消息并发送一个TCP数据包(包含命令)给lwipDevice以告知发送它的信息。

  3. 但是在 lwipDevice 端没有收到这条消息。因此它不会向 LinuxDevice 发送任何响应。并一次又一次地重复步骤 1-3。

现在这是用于 TCP 服务器的 lwipDevice 代码:

long server_sock=-1;
#define FAIL 1
#define PASS 0
int CreateTcpServerSocket(long *pSock, int port)
{
struct sockaddr_in sin;
int addrlen = sizeof(sin);
int e;
struct linger linger;
linger.l_linger=0;
int i = 1;

*pSock = socket(AF_INET, SOCK_STREAM, 0);

if (*pSock == -1)
{
printf("*** createTcpSercerSocket:open sock error,port %d\n",port);
return FAIL;
}

memset((char *)&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_len = sizeof(sin);
sin.sin_addr.s_addr = htonl(INADDR_ANY); /* wildcard IP address */
sin.sin_port = htons(port);


e = bind(*pSock, (struct sockaddr*)&sin, addrlen);
if (e != 0)
{
printf("error %d binding tcp listen on port\n");
closesocket(*pSock);
*pSock = -1;
return FAIL;
}

lwip_ioctl(*pSock, FIONBIO, &i); //Set Non blocking mode

e = listen(*pSock, 2);

if (e != 0)
{
pprintf("error :listen on TCP server\n");
closesocket(*pSock);
*pSock = -1;
return FAIL;
}

return PASS;
}
void vTCPTask(void *parm)
{
struct sockaddr client; /* for BSDish accept() call */
int clientsize;
long sock;

if(CreateTcpServerSocket(&server_sock, 8000) == FAIL) //Here server created successfully
{
printf("Fail to create server!!!!!\n");
server_sock=-1;
}

while(1)
{
// some code for other stuff

sock= accept(server_sock, &client, &clientsize); //This line always fails and reurn -1

if(sock != -1)
{
printf("accepted socket:\n\n");
//...now receive data from client....
// send some data to client
}

// some code for other stuff

//sleep for 15 seconds
}

}
int main()
{

//...initilization of lwip stack
//....some more code
//...................

xTaskCreate(vTCPTask, (signed char const *) "tcptask",
356, NULL, 3, (xTaskHandle *)&xNotifierServiceTaskHandle);


/* Start the scheduler */
vTaskStartScheduler();

return 1
}

我已经检查了 lwip_accept 函数,它将从这种情况返回:

  if (netconn_is_nonblocking(sock->conn) && (sock->rcvevent <= 0))
{
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): returning EWOULDBLOCK\n", s));
sock_set_errno(sock, EWOULDBLOCK);
return -1;
}

编辑:

我知道 netconn_is_nonblocking(sock->conn) 条件将始终为真,因为已将套接字设置为非阻塞模式。但是为什么 sock->rcvevent 即使 LinuxDevice 已经向它发送数据包也总是为零?

编辑:

出于测试目的,在任务中注释了所有其他代码(参见 //some code for other stuff )然后套接字被成功接受并且我尝试接收数据包但现在问题是它现在被卡住了在lwip_recvfrom函数中(注:LinuxDevice继续发送数据包)。于是进一步调试,发现卡在函数sys_arch_mbox_fetch(函数调用流程::lwip_recvfrom\netconn_recv\netconn_recv_data\sys_arch_mbox_fetch)。

有谁知道它有什么问题吗?

最佳答案

您已将套接字配置为非阻塞,因此 accept() 调用将永远不会阻塞。如果没有待处理的传入连接,它将返回 EWOULDBLOCK 错误代码,这就是您所看到的。

关于c - TCP 服务器似乎无法在 LWIP+FreeRTOS 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24968326/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com