完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 jiero39 于 2016-3-9 09:59 编辑 一直没弄明白tftp.c文件中定义的变量g_tftp_socket(这个g是代表global的意思吗?)具体含义。g_tftp_socket初始化为-1(不知道为什么会初始化为-1)。第一次赋值是在tftp.c的void TFTP_init(uint8_t socket, uint8_t *buf)函数内(见图1),g_tftp_socket = open_tftp_socket(socket)。当socke创建失败时,open_tftp_socket(socket)会返回-1,并赋值给g_tftp_socket。 图1 而g_tftp_socket在tftp.c文件的void send_tftp_wrq(uint8_t *filename, uint8_t *mode, TFTP_OPtiON *opt, uint8_t opt_len)函数中,作为实参传递给int send_udp_packet(int socket, uint8_t *packet, uint32_t len, uint32_t ip, uint16_t port)的第一个形参int socket,见图2。现在的问题是当g_tftp_socket等于-1时还能传递给int socket吗?(我的理解是socket的值只能是0到7,因为一共8个socket,编号刚好是0到7,怎么也不可能是-1) 图2 假如int send_udp_packet(int socket, uint8_t *packet, uint32_t len, uint32_t ip, uint16_t port)的第一个形参int socket等于-1,那么这个-1将会传递给send_udp_packet内的sendto(socket, packet, len, (uint8_t *)&ip, port)第一个形参socket,而sendto()的原型为uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port)。它的第一个参数的类型为SOCKET(重定义的类型,typedef uint8 SOCKET;)。有符号变为无符号,则第一个参数被传递进来的值则为255。而uint16 sendto()函数内都会使用SOCKET s这个变量(见图3)。比如其中的IINCHIP_WRITE( Sn_DIPR0(s), addr[0])。Sn_DIPR0(s)为宏定义(#define Sn_DIPR0(ch) (0x000C08 + (ch<<5)))。如果s=255,取它的高三位(ch<<5)那么SnSn_DIPR0(s)相当于选中了SOCKET 7。如果真是那样的话,那岂不是在给SOCKET 7 对应的寄存器写数据? |
|
相关推荐
1个回答
|
|
我觉得主程序中:TFTP_init(SOCK_TFTP,g_socket_rcv_buf); 已经设定socket参数为SOCK_TFTP,也就是Socket1,后面无需再定义g_tftp_socket这个参数,,在tftp.c里面把open_tftp_socket(uint8_t sock)这个函数去掉,TFTP_init这个函数直接按照下面这样定义就行:
void TFTP_init(uint8_t socket, uint8_t *buf) { init_tftp(); socket(sock, Sn_MR_UDP, local_port,0); g_tftp_rcv_buf = buf; } 这样就跟g_tftp_socket没关系了,把用到g_tftp_socket的函数全部换成sock就行 |
|
|
|
只有小组成员才能发言,加入小组>>
477个成员聚集在这个小组
加入小组5098 浏览 1 评论
12109 浏览 5 评论
3503 浏览 2 评论
2968 浏览 0 评论
12687 浏览 2 评论
w5500 作为tcp server,客户端异常发送【RST,ACK】断开连接问题
1549浏览 1评论
1081浏览 0评论
使用stm32,通过spi的dma 收发,运行多次读写以后w5500发送正常,接收卡死,高人帮忙看看
6291浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 00:30 , Processed in 0.582396 second(s), Total 81, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号