- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用 lwip+freeRTOS 在我的一个嵌入式设备中开发了一个 tcp 服务器。现在这是我使用我的设备(我们将其命名为 lwipDevice)与其他设备(其他设备具有 Linux 系统,我们将其命名为 LinuxDevice)进行通信的流程
将 UDP 数据包从 lwipDevice 发送到 LinuxDevice 以启动我已准备好共享我的信息。
现在LinuxDevice成功识别此消息并发送一个TCP数据包(包含命令)给lwipDevice以告知发送它的信息。
但是在 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/
我有一个奇怪的问题。一段时间以来,我一直在尝试更换一个小型协议(protocol)转换器(基本上是以太网的双向串行...主站和从站),以获得具有更多功能的东西。 背景故事 经过大量的逆向工程,我发现了
我正在 ST Cortex M3 设备上创建服务器。我正在使用 lwip API 和 FreeRTOS。一切正常,但响应时间很慢。我目前使用的是 lwip 1.3.2 和 FreeRTOS 7.3。
目前我正在尝试在嵌入式板上移植 LWIP(轻量级 TCP/IP 堆栈)。 在查看代码的过程中,我想出了一个数组声明(在 memp.c 文件中),它看起来很奇怪,我过去从未见过这种类型的声明。 虽然它是
我正在为一个没有操作系统的嵌入式系统 (Zybo) 实现一个 TCP 客户端,我完全是 LwIP 的新手。在谷歌上搜索了一段时间后,我发现了一些关于如何使用它的示例。 我想知道是否有任何方法可以通过它
前言 。 前面章节太长了,不得不分开. 这里已源码为主,默认读者已知晓概念或原理,概念或原理可以参考前面章节,有分析. 参考:李柱明博客: https://www.cnblogs.co
前言 终于到接口层了. 原文:李柱明博客: https://www.cnblogs.com/lizhuming/p/17442931.html 。 。 框架描述 前面我们已经学完
我使用在stm32处理器(stm32f407)上使用的套接字api运行freeRTOS和lwip 1.4.1。 总的来说,它工作得很好。 我可以使用udp和tcp发送和接收数据。 但是在3到7天的时间
我正在 echo 服务器 lwIP 下使用以太网通信。我想通过以太网捕获从 DMA 到主机的样本。系统通过UART采集样本。 我无法让 lwIP 在不等待 ACK 的情况下发送超过 2 个高于 150
我有一个运行 LwIP 服务器 (v1.2) 的嵌入式系统,我需要能够将数据数组流式传输到客户端的 javascript 中吗?我正在考虑使用 chrome 和一些 HTML5 功能,所以有些人建议使
在浏览了 LWIP 文档之后,我写了一个简单的 tcp echo 服务器代码。为了编译它并创建一个可执行文件,我编写了以下 Makefile。现在,当我运行命令 make all 时,它会为包含在 m
我正在尝试从 lwip 定义“ip_addr”。那是我的代码: #include "lwip/tcp.h" #include "ip_addr.h" ... struct ip_addr ip; 但是
美好的一天! 我想制作一个客户端并将其连接到 netcat 简单服务器。 1) 使用默认设置和#define 编译的库(唯一的东西——我设置了一些调试信息)2) 将 lib 链接到项目(工作正常)3)
我看到了 lwIP有一些 AutoIP(又名 IPv4LL,又名 RFC 3927 )代码,但我不知道它是否在 Zeroconf 中做了任何更高的事情堆栈,即 mDNS 和 DNS-SD (与 RFC
简单地,我通过在接收回调函数中检查 pbuff 的有效负载来检查并获取发送到我的 microplaze 的数据,并且它可以在我可以看到 microplaze 回显我的消息的地方工作,但是当我尝试将它们
我正在将 LwIP 与 FreeRTOS 结合使用。我的项目基于此 URL FreeRTOS with LwIP project 上的示例。我还将 LPC1769 与 LPCXpresso 版本 6.
我正在使用Xilinx Ethernetlite(LWIP)设计。仅当buf = 32时,我才能通过以太网将数据从KC板传输到PC(Hercules)。但是我的实际缓冲区大小是1024。如何将缓冲区大
所以,我有一个有效的 TCP Echo 示例。我试图完成的是能够接收 TCP 传输,以及通过 TCP 和 UDP 发送数据。我正在使用原始 LWIP 并将有一个我将与之交互的 PC 应用程序。我希望能
在 echo 示例中,我们有这个函数可以再次发送相同的数据包,以便回显数据,我想更改它以便发送固定数据,无论用户发送什么,所以我更改了这个: err = tcp_write(tpcb, p->
我在读取和存储 TCP 服务器接收到的数据时遇到了问题。我正在使用 LWIP 库和 NUCLEO-F746ZG 板。我想我必须在执行 es->p 时获取数据。我读过,你必须使用 payload 但我不
在我的 STM32F7 上,我必须使用串行端口连接 3G 调制解调器。我可以使用 AT 命令与调制解调器通信。我想使用 LWIP 中的 PPPos(PPP over serial)库进入 PPP 模式
我是一名优秀的程序员,十分优秀!