搜索
bottom↓
回复: 8

lwIP求助,关于socket编写TCP服务器的问题

[复制链接]

出0入85汤圆

发表于 2011-11-4 14:25:50 | 显示全部楼层 |阅读模式
最近在学习lwIP,经过多番努力终于可以ping通了
但在测试socket函数时发生了问题,参考ZLG的代码写个个WebSever的代码
硬件是ARM7+DM9000A,LwIP是1.4的

当使用RAW API实现WebSever时没有问题,但使用netconn或者BSD socket实现时会出现accept会执行不下去了
主机可以连接到我的设备,但很快就断开了,用网络监控软件抓包发现设备返回RST,如下图:

(原文件名:抓包.JPG)
通过wIP的诊断信息也出现了:accept_function: newpcb->tate: ESTABLISHED

由于本人刚接触以太网,所以请大侠们帮我分析下我的问题可能出在哪里,或者说我该从哪方面入手

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入85汤圆

 楼主| 发表于 2011-11-4 14:50:45 | 显示全部楼层
刚才把所有lwIP的debug打开了,找到问题的所在处了:tcp_pcb_purge: data left on ->unacked

部分诊断信息:
+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags ACK
-+-+-+-+-+-+-+-+-+-+-+-+-+-+
State: SYN_RCVD
TCP connection established 1255 -> 80.
accept_function: newpcbpbuf_alloc(length=66)
pbuf_alloc: allocated pbuf 8100B68C
pbuf_alloc(length=66) == 8100B68C
update_arp_entry: 192.168.1.1 - 00:19:E0:CC:BD:AE
find_entry: found empty entry 1
find_entry: no empty entry found and not allowed to recycle
etharp_arp_input: incoming ARP request
etharp_arp_input: ARP request was not for us.
pbuf_free(8100B68C)
pbuf_free: deallocating 8100B68C
low_level_input: rx no packet !
ESTABLISHED
tcp_pcb_purge
tcp_pcb_purge: data left on ->unacked
pbuf_free(8100721C)
pbuf_free: deallocating 8100721C
tcp_abandon: sending RST
pbuf_alloc(length=20)
pbuf_alloc(length=20) == 8100721C
inet_chksum_pseudo(): checksumming pbuf 8100721C (has next 0)
inet_chksum_pseudo(): pbuf chain lwip_chksum()=4D39
pbuf_header: old 81007250 new 8100723C (20)
ip_output_if: dm0

但我该怎么解决这个问题呢?继续努力~~

出0入0汤圆

发表于 2011-11-4 15:43:51 | 显示全部楼层
把配置文件发上来看看

出0入85汤圆

 楼主| 发表于 2011-11-4 15:53:03 | 显示全部楼层
回复【2楼】kanprin  
把配置文件发上来看看
-----------------------------------------------------------------------

谢谢关注!是lwipopts.h文件吗?opt.h没改,下面是lwipopts.h

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__
//#include "ucos_ii.h"


#define LWIP_DEBUG                  1

#define DEFAULT_THREAD_STACKSIZE    LWIP_STK_SIZE

#define SLIPIF_THREAD_STACKSIZE     LWIP_STK_SIZE

#define PPP_THREAD_STACKSIZE        LWIP_STK_SIZE

#define LWIP_HTTPD_SSI              1

#define LWIP_HTTPD_CGI              1

#define LWIP_HTTPD_DYNAMIC_HEADERS  1

#define LWIP_HTTPD_MAX_TAG_NAME_LEN 8

#define TCP_LISTEN_BACKLOG          1

#define ETHARP_TRUST_IP_MAC         1

/*----------------Thread Priority---------------------------------------------*/

#define TCPIP_THREAD_PRIO                        LWIP_TASK_START_PRIO+1

#define DEFAULT_THREAD_PRIO                        LWIP_TASK_START_PRIO+2

#define PING_THREAD_PRIO                        LWIP_TASK_START_PRIO+3

#define HTTPSERVER_THREAD_PRIO      LWIP_TASK_START_PRIO+4

/**
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
* critical regions during buffer allocation, deallocation and memory
* allocation and deallocation.
*/
#define SYS_LIGHTWEIGHT_PROT    0

/**
* NO_SYS==1: Provides VERY minimal functionality. Otherwise,
* use lwIP facilities.
*/
#define NO_SYS                  0

/* ---------- Memory options ---------- */
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
   lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
   byte alignment -> define MEM_ALIGNMENT to 2. */
#undef  MEM_ALIGNMENT
#define MEM_ALIGNMENT           4


/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#undef MEM_SIZE
#define MEM_SIZE                (1600)

/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
   sends a lot of data out of ROM (or other static memory), this
   should be set high. */
#undef MEMP_NUM_PBUF
#define MEMP_NUM_PBUF           10
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
   per active UDP "connection". */
#undef MEMP_NUM_UDP_PCB
#define MEMP_NUM_UDP_PCB        6
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
   connections. */
#undef MEMP_NUM_TCP_PCB
#define MEMP_NUM_TCP_PCB        10
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
   connections. */
#undef MEMP_NUM_TCP_PCB_LISTEN
#define MEMP_NUM_TCP_PCB_LISTEN 6
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
   segments. */
#undef MEMP_NUM_TCP_SEG
#define MEMP_NUM_TCP_SEG        12
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
   timeouts. */

#define MEMP_NUM_SYS_TIMEOUT    10


/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#undef PBUF_POOL_SIZE
#define PBUF_POOL_SIZE          10

/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#undef PBUF_POOL_BUFSIZE
#define PBUF_POOL_BUFSIZE       1500 /* LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) */


/* ---------- TCP options ---------- */
#define LWIP_TCP                1
#undef TCP_TTL
#define TCP_TTL                 255

#undef TCPIP_THREAD_STACKSIZE
#define TCPIP_THREAD_STACKSIZE                  LWIP_STK_SIZE

/* Controls if TCP should queue segments that arrive out of
   order. Define to 0 if your device is low on memory. */
#undef TCP_QUEUE_OOSEQ
#define TCP_QUEUE_OOSEQ         0

/**
* TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages
* The queue size value itself is platform-dependent, but is passed to
* sys_mbox_new() when tcpip_init is called.
*/
#undef TCPIP_MBOX_SIZE
#define TCPIP_MBOX_SIZE         MAX_QUEUE_ENTRIES

/**
* DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a
* NETCONN_TCP. The queue size value itself is platform-dependent, but is passed
* to sys_mbox_new() when the recvmbox is created.
*/
#undef DEFAULT_TCP_RECVMBOX_SIZE
#define DEFAULT_TCP_RECVMBOX_SIZE       MAX_QUEUE_ENTRIES


/**
* DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections.
* The queue size value itself is platform-dependent, but is passed to
* sys_mbox_new() when the acceptmbox is created.
*/
#undef DEFAULT_ACCEPTMBOX_SIZE
#define DEFAULT_ACCEPTMBOX_SIZE         MAX_QUEUE_ENTRIES

/* TCP Maximum segment size. */
#undef TCP_MSS
#define TCP_MSS                 (1500 - 40)          /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */

/* TCP sender buffer space (bytes). */
#undef TCP_SND_BUF
#define TCP_SND_BUF             (4*TCP_MSS)

/* TCP sender buffer space (pbufs). This must be at least = 2 *
   TCP_SND_BUF/TCP_MSS for things to work. */
#undef TCP_SND_QUEUELEN
#define TCP_SND_QUEUELEN        ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))

/* TCP receive window. */
#undef TCP_WND
#define TCP_WND                 (4 * TCP_MSS)


/* ---------- ICMP options ---------- */
#define LWIP_ICMP                       1


/* ---------- DHCP options ---------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
   interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
   turning this on does currently not work. */
#define LWIP_DHCP               1


/* ---------- UDP options ---------- */
#define LWIP_UDP                1
#undef UDP_TTL
#define UDP_TTL                 255
#undef DEFAULT_UDP_RECVMBOX_SIZE
#define DEFAULT_UDP_RECVMBOX_SIZE       MAX_QUEUE_ENTRIES

/* -----------RAW options -----------*/
#undef DEFAULT_RAW_RECVMBOX_SIZE
#define DEFAULT_RAW_RECVMBOX_SIZE       MAX_QUEUE_ENTRIES
#define DEFAULT_ACCEPTMBOX_SIZE         MAX_QUEUE_ENTRIES

/* ---------- Statistics options ---------- */
#undef LWIP_STATS
#define LWIP_STATS 0
#define LWIP_PROVIDE_ERRNO 1


/*
   --------------------------------------
   ---------- Checksum options ----------
   --------------------------------------
*/

/*
The STM32F107 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:
- To use this feature let the following define uncommented.
- To disable it and process by CPU comment the  the checksum.
*/
//#define CHECKSUM_BY_HARDWARE


#ifdef CHECKSUM_BY_HARDWARE
  /* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
  #undef CHECKSUM_GEN_IP
  #define CHECKSUM_GEN_IP                 0
  /* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
  #undef CHECKSUM_GEN_UDP
  #define CHECKSUM_GEN_UDP                0
  /* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
  #undef CHECKSUM_GEN_TCP
  #define CHECKSUM_GEN_TCP                0
  /* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
  #undef CHECKSUM_CHECK_IP
  #define CHECKSUM_CHECK_IP               0
  /* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
  #undef CHECKSUM_CHECK_UDP
  #define CHECKSUM_CHECK_UDP              0
  /* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
  #undef CHECKSUM_CHECK_TCP
  #define CHECKSUM_CHECK_TCP              0
#else
  /* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
  #define CHECKSUM_GEN_IP                 1
  /* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
  #define CHECKSUM_GEN_UDP                1
  /* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
  #define CHECKSUM_GEN_TCP                1
  /* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
  #define CHECKSUM_CHECK_IP               1
  /* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
  #define CHECKSUM_CHECK_UDP              1
  /* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
  #define CHECKSUM_CHECK_TCP              1
#endif


/*
   ----------------------------------------------
   ---------- Sequential layer options ----------
   ----------------------------------------------
*/
/**
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
*/
#define LWIP_NETCONN                    1
/*
   ------------------------------------
   ---------- Socket options ----------
   ------------------------------------
*/
/**
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
*/
#define LWIP_SOCKET                     1

#define LWIP_COMPAT_MUTEX               1

/**
* MEMCPY: override this if you have a faster implementation at hand than the
* one included in your C library
*/
#ifndef MEMCPY
#define MEMCPY(dst,src,len)             memcpy((INT8U*)dst,(INT8U*)src,len)
#endif
#ifndef SMEMCPY
#define SMEMCPY(dst,src,len)            memcpy((INT8U*)dst,(INT8U*)src,len)
#endif
#endif /* __LWIPOPTS_H__ */

出0入85汤圆

 楼主| 发表于 2011-11-4 15:55:05 | 显示全部楼层
查了下,错误发生在accept_function()函数中:

  /* We have to set the callback here even though
   * the new socket is unknown. conn->socket is marked as -1. */
  newconn = netconn_alloc(conn->type, conn->callback);

  if (newconn == NULL) {
    return ERR_MEM;
  }

这里返回的 ERR_MEM 导致后面的问题,也就是内存分配出问题了。
到 netconn_alloc() 函数中发现 MEMP_NETCONN 好像没有定义。。。

出0入85汤圆

 楼主| 发表于 2011-11-4 16:55:11 | 显示全部楼层
问题找到了,是我的 OS_MAX_EVENTS 定义的太小了!

出0入0汤圆

发表于 2011-11-7 10:36:23 | 显示全部楼层
请问一下,哪位大侠知道写好LwIP代码后,怎么通过ARM测试信号能否正确得传输到上位机上呢?谢谢了!

出0入0汤圆

发表于 2012-9-22 09:48:33 | 显示全部楼层
楼主能不能看看您的socket接口部分的代码是如何写的呀?

出100入101汤圆

发表于 2017-6-20 14:13:22 | 显示全部楼层
OS_MAX_EVENTS
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 05:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表