查看: 3591|回复: 4

[求助] RTCS组件连接机应答的问题

[复制链接]

该用户从未签到

2

主题

46

帖子

0

注册会员

Rank: 2

积分
169
最后登录
2019-6-28
发表于 2016-5-24 17:01:43 | 显示全部楼层 |阅读模式
MQX版本:MQX4.2
采用RTCS组件进行以太网通信,器件调试通过抓包工具发现,TCP的连接应答部分及TCP应答标志如下图
TCP抓包.png
测试发现,作为TCP服务器是连接应答偶尔出现两次SYN+ACK包;
同时所以的应答标志均为PSH+ACK,
请问这正常吗,需要怎么设置。
我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

2

主题

46

帖子

0

注册会员

Rank: 2

积分
169
最后登录
2019-6-28
 楼主| 发表于 2016-5-25 08:51:25 | 显示全部楼层
楼上微笑是表示没有问题吗?
回复 支持 反对

使用道具 举报

该用户从未签到

734

主题

6393

帖子

0

超级版主

Rank: 8Rank: 8

积分
26004
最后登录
2025-10-24
发表于 2016-5-26 16:51:34 | 显示全部楼层
这个问题已转给MQX工程师,希望楼主能将问题描述的更加详细一点,比如代码是否来自,基于板子或者芯片等等。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

46

帖子

0

注册会员

Rank: 2

积分
169
最后登录
2019-6-28
 楼主| 发表于 2016-5-27 09:11:56 | 显示全部楼层
芯片K60  MQX版本4.2
  1. void rtcs_init(void)
  2. {
  3.     uint32_t         error;
  4.     _enet_address enet_addr = ENET_MAC;
  5.    
  6.     //初始化RTCS的一些全局变量,按需求设置减少内存使用
  7.     _RTCSPCB_init = 4; //表示数据包控制块 , 指的是你希望RTCS协议栈能够处理的包的数量
  8.     _RTCSPCB_grow = 2;
  9.     _RTCSPCB_max = 20;
  10.     _RTCS_msgpool_init = 2; //表示RTCS消息池, 它用来封装对RTCS协议栈的应用请求,该值指的是应用程式同时能发多少个请求给RTCS协议栈
  11.     _RTCS_msgpool_grow = 1;
  12.     _RTCS_msgpool_max  = 4;
  13.     _RTCS_socket_part_init = 2; //应用中创建的所有的socket的数量
  14.     _RTCS_socket_part_grow = 1;
  15.     _RTCS_socket_part_max  = 8;
  16.         
  17.     error = RTCS_create();  //RTCS创建
  18.     if (error == RTCS_OK)  {  printf("\nRTCS创建成功\n");  }
  19.     else{ printf("\nRTCS创建失败\n");}
  20.    
  21.     error = ipcfg_init_device(BSP_DEFAULT_ENET_DEVICE, enet_addr); //网络设备初始化
  22.     if (error == IPCFG_OK)  {  printf("\n网络设备初始化成功\n");  }
  23.     else{ printf("\n网络设备初始化失败\n");}
  24. //    _lwsem_create (&lock, 1);
  25. }

  26. /*函数---------------------------------------------------------------
  27. *   
  28. * 函数名称: enet_set
  29. * 功能概要:以太网参数设置
  30. * 参数说明:
  31. * 函数返回:无
  32. * 备注:              
  33. *END*--------------------------------------------------------------*/
  34. void enet_set(void)
  35. {
  36.     uint32_t temp;
  37.     uint32_t server_sock; //用于服务器待连接刘套接字
  38.     IPCFG_IP_ADDRESS_DATA        ip_data;
  39.     sockaddr  local_sockin; //本端套接字参数
  40.    
  41.     //变更参数
  42.     ip_data.ip = local_ipaddr;
  43.         ip_data.mask = local_ipmask;
  44.         ip_data.gateway = local_ipgateway;
  45.    
  46.     //静态IP绑定
  47.     temp =ipcfg_bind_staticip (BSP_DEFAULT_ENET_DEVICE, &ip_data);
  48.     if (temp == IPCFG_OK)  {  printf("\n静态IP绑定成功\n");  }
  49.     else{ printf("\n静态IP绑定失败\n");}
  50.    
  51.     //创建套接字 参数:协议  流套接字(有链接,以字节为单位传输)/保温套接字(无连接,以数据块为单位传输)
  52.     server_sock = socket(AF_INET, SOCK_STREAM, 0);
  53.     if (server_sock == RTCS_SOCKET_ERROR) { printf("\n套接字创建错误 \n");  }
  54.     else { printf("\nTCP套接字创建成功 \n");  }
  55.    
  56.     //设置发送接收缓冲大小,设置超时时间
  57.     temp = SOCKET_SEND_BUFFER_SIZE;
  58.     (void) setsockopt(server_sock, SOL_TCP, OPT_TBSIZE, &temp, sizeof(temp));
  59.     temp = SOCKET_RECEIVE_BUFFER_SIZE;
  60.     (void) setsockopt(server_sock, SOL_TCP, OPT_RBSIZE, &temp, sizeof(temp));
  61.     temp = RTCSCFG_TELNETSRV_TIMEWAIT_TIMEOUT;
  62.         setsockopt(server_sock, SOL_TCP, OPT_TIMEWAIT_TIMEOUT, &temp, sizeof(temp));
  63.    
  64.     //调用bind()函数将套接字与本地地址绑定(服务器绑定)
  65.     local_sockin.sin_family = AF_INET;
  66.     local_sockin.sin_port = local_port;
  67.     local_sockin.sin_addr.s_addr = INADDR_ANY;
  68.     temp = bind(server_sock, &local_sockin, sizeof(local_sockin));
  69.     if (temp != RTCS_OK)  {  printf("\n绑定套接字失败\n");  }
  70.     else
  71.     {
  72.         printf("\n绑定套接字成功\n");
  73.         //套接字设置监听
  74.         temp = listen(server_sock, 0);
  75.         if (temp != RTCS_OK)  {  printf("Error 0x%X: Unable to put IPv4 socket in listening state.\n", temp);  }
  76.     }
  77.     printf("监听参数:  IPv4 Address: %d.%d.%d.%d, port:%d\n", IPBYTES(local_ipaddr), local_port);
  78.     printf("\nWaiting for incoming connection...");
  79.    
  80.     dmu_tid.server_socket_tid = _task_create(0, SERVER_SOCKET_TASK, server_sock);
  81. //    enet_rx_num=0;
  82. }

  83. /*任务---------------------------------------------------------------
  84. *   
  85. * 任务名称: server_socket_task
  86. * 功能概要:等待服务器流连接套接字的建立,建立后创建接收任务enet_rx_task()
  87. * 备注:
  88. *END*--------------------------------------------------------------*/
  89. void server_socket_task(uint32_t parameter)
  90. {
  91.     uint32_t option;
  92.     while (1)
  93.     {
  94. //        if(enet_rx_num>2)
  95. //        {
  96. //            shutdown(iodhsocks[0], FLAG_CLOSE_TX); //断开套接字
  97. //            _task_destroy(dmu_tid.enet_rx_tid[0]);
  98. //            shutdown(iodhsocks[1], FLAG_CLOSE_TX); //断开套接字
  99. //            _task_destroy(dmu_tid.enet_rx_tid[1]);
  100. //            enet_rx_num=0;
  101. //        }
  102.         //等待新的套接字流来从远程端点接收传入的连接
  103.         iodh_sock= accept(parameter, NULL, NULL);
  104. //        iodhsocks[enet_rx_num]=iodh_sock;
  105.         if (iodh_sock == RTCS_SOCKET_ERROR)
  106.         {
  107.             uint32_t status;
  108.             status = RTCS_geterror(iodh_sock);
  109.             printf("Fatal Error: Unable to accept incoming connection. ");
  110.             if (status == RTCS_OK){printf("Connection reset by peer.");}
  111.             else {  printf("Accept() failed with error code 0x%X.\n", status); }
  112.         }
  113. //        //设置接收不等待(非阻塞I/O),  TCP的PUSH 接收压栈(延迟传输)
  114. //        option = TRUE;
  115. //        retval = setsockopt(client_sock, SOL_TCP, OPT_RECEIVE_NOWAIT, &option, sizeof(option)); //FALSE(默认值)
  116. //        retval = setsockopt(client_sock, SOL_TCP, OPT_RECEIVE_PUSH, &option, sizeof(option));   //TRUE(默认值)
  117. //        if (retval != RTCS_OK){  printf("Fatal Error: Unable to set socket options."); }
  118.         option = TRUE;
  119.         setsockopt(client_sock, SOL_TCP, OPT_SEND_NOWAIT, &option, sizeof(option));   //TRUE(默认值)
  120.         option = FALSE;
  121.         setsockopt(client_sock, SOL_TCP, OPT_SEND_PUSH, &option, sizeof(option));   //TRUE(默认值)
  122.         printf("\naccept starting 0x%lx\n",iodh_sock);

  123. //        dmu_tid.enet_rx_tid[enet_rx_num] = _task_create(0, ENET_RX_TASK, iodh_sock);
  124. //        if (dmu_tid.enet_rx_tid[enet_rx_num] == MQX_NULL_TASK_ID)
  125. //        {
  126. //            fprintf(stderr, "Fatal Error 0x%X: Unable to create receive task.", _task_get_error());
  127. //        }
  128. //        enet_rx_num++;
  129.         dmu_tid.enet_rx_tid = _task_create(0, ENET_RX_TASK, iodh_sock);
  130.         if (dmu_tid.enet_rx_tid == MQX_NULL_TASK_ID)
  131.         {
  132.             fprintf(stderr, "Fatal Error 0x%X: Unable to create receive task.", _task_get_error());
  133.         }
  134.         
  135.         _time_delay(1);
  136.     }
  137. }

  138. /*任务---------------------------------------------------------------
  139. *   
  140. * 任务名称: enet_rx_task
  141. * 功能概要:服务器流套接字产生,接收以太网数据;
  142. *          当接收数据错误时,断开套接字,销毁任务释放内存
  143. * 参数说明:parameter:任务参数的结构体指针,主要:连接的套接字句柄
  144. *
  145. *END*--------------------------------------------------------------*/
  146. void enet_rx_task(uint32_t parameter)
  147. {
  148.     uint8_t RecvBuf[1050];
  149.     uint32_t count = 0;
  150.    
  151.     while(1)
  152.     {
  153.         count = recv(parameter, (void *)RecvBuf, sizeof(RecvBuf), 0);
  154.         if (count == RTCS_ERROR)
  155.         {
  156.             printf("\nError, recv() failed with error code %lx", RTCS_geterror(parameter)); //1636:连接对端重置  1638:连接断开
  157.             shutdown(parameter, FLAG_CLOSE_TX); //连接错误,断开套接字
  158.             _task_destroy(_task_get_id());
  159. //            enet_rx_num--;
  160.         }
  161.         else
  162.         {
  163.             i3r_package(RecvBuf,count);
  164. //            printf("%s\n%d\n",RecvBuf,count);
  165.         }        
  166.         _time_delay(1);
  167.     }
  168. }
复制代码
回复 支持 反对

使用道具 举报

  • TA的每日心情
    无聊
    2018-9-20 10:55
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    24

    主题

    1189

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1642
    最后登录
    2022-3-21
    发表于 2016-8-18 09:51:23 | 显示全部楼层
    PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-10-26 02:15 , Processed in 0.090548 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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