硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2388|回复: 2
收起左侧

[RL-TCPnet] RL_TCPclient不能重新连接服务器

[复制链接]

25

主题

100

回帖

180

积分

初级会员

积分
180
发表于 2018-8-3 16:22:26 | 显示全部楼层 |阅读模式
本帖最后由 xujun 于 2018-8-3 16:26 编辑
  1. void vTaskSocket(void *arg)
  2. {
  3.                 char recvbuf[500];
  4.         char sendbuf[500] ;
  5.         uint8_t cmd = 0,i;
  6.         uint16_t len = 0;
  7.         int sock, res;
  8.         unsigned long sck_mode;
  9.         SOCKADDR_IN addr;
  10.         while (1)
  11.         {
  12.                 /* 创建一个socket
  13.                    第1个参数AF_INET:当前仅支持这个类型的地址族。
  14.                    第2个参数SOCK_STREAM:表示数据流通信类型,即使用的TCP。
  15.                    第3个参数0 :配置为0的话,自动跟第2个参数进行协议匹配,这里就是TCP协议。
  16.                 */
  17.                 sock = socket (AF_INET, SOCK_STREAM, 0);
  18.                
  19.                 /* 设置使能KEEP ALIVE,让客户端和服务器保存连接 */
  20.                 sck_mode = 1;
  21.                 res = ioctlsocket (sock, FIO_KEEP_ALIVE, &sck_mode);
  22.                 if (res == SCK_SUCCESS)
  23.                 {
  24.                 }
  25.                 else
  26.                 {
  27.                 }

  28.                 /* 端口号设置为1001 */
  29.                 addr.sin_port = htons(1001);
  30.                
  31.                 /* 与函数socket中的AF_INET作用一样 */
  32.                 addr.sin_family = PF_INET;
  33.                
  34.                 addr.sin_addr.s_b1 = 192;
  35.                 addr.sin_addr.s_b2 = 168;
  36.                 addr.sin_addr.s_b3 = 1;
  37.                 addr.sin_addr.s_b4 = 167;

  38.                 /* 客户端连接远程服务器,如果远程服务器还未创建,此函数会立即返回 */
  39.                 res = connect (sock, (SOCKADDR *)&addr, sizeof (addr));

  40.                 while (1)
  41.                 {
  42.                         /*
  43.                           socket数据接收函数,如果recv工作在阻塞模式,使用这个函数注意以下事项:
  44.                           1. 此函数的溢出时间受到Net_Config.c中宏定义 BSD_RCVTOUT 的限制。溢出时间到会自动退出。
  45.                           2. 这个函数接收到一次数据包就会返回,大于或者小于设置的缓冲区大小都没有关系,如果数据量
  46.                              大于接收缓冲区大小,用户只需多次调用函数recv进行接收即可。
  47.                           3. 实际接收到数据大小通过判断此函数的返回值即可。
  48.                         */
  49.                         res = recv (sock, recvbuf, sizeof(recvbuf), 0);
  50.                         if (res <= 0)
  51.                         {
  52.                                 if((res == SCK_EINVALID) || (res == SCK_ECLOSED))
  53.                                 {
  54.                                        
  55.                                         break;        
  56.                                 }
  57.                         }
  58.                         else
  59.                         {

  60.                                 res = send (sock, (char *)sendbuf, len+14+2, 0);
  61.                                 if (res < 0)
  62.                                 {
  63.                                 }
  64.                                 else
  65.                                 {                                                
  66.                                 }
  67.                         }
  68.                 }
  69.                 res = closesocket (sock);
  70.         }
  71. }
复制代码
客户端主动连接服务器,一上电能连接成功,但服务主动关闭连接后,客户端就不能再连接,在线调试发现,socket设置的数量是5,重新连接5次就失败,sock返回-2 ,无效的socket,但明明已经close了失败的连接了,请教一下还是缺少什么操作么?

发现如果是板子先上电,服务器没启动,连接5次后也是失败一直不能再连接了。怀疑是不是还缺少什么操作?好像是socket没有释放掉


回复

使用道具 举报

25

主题

100

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2018-8-3 16:40:03 | 显示全部楼层
本帖最后由 xujun 于 2018-8-3 16:41 编辑

这个问题的情况比较多,整理下:
为了客户端跟服务器的长时间连接,会使能keep-alive,保证长时间连接。这种情况下,
1. 如果服务器端断开了连接,或者直接关闭服务器,客户端会执行Net_Config.c文件中设置的重连次数和重连时间。
都溢出了,是不会再连接了。所以就需要通过函数tcp_get_state判断状态,实时调用函数tcp_connect进行连接。
而且针对这种情况,实际效果还有些特殊,一旦服务器端断开后,重新连接的时候有时候可以立即连接上,有时候不行,
程序一直在发SYN包,差不多15秒左右才可以重连上。
2. 还有一种情况就是网线插拔了,这种情况的话,通过函数tcp_get_state判断状态,实时调用函数tcp_connect进行连接就好。


总结,不管是哪一种情况,都要不断的调用tcp_connect进行重连。重连的时候他有一个重连次数和重连时间的


这个是原始socket的问题,BSD socket中是申请socket就开始失败,是不是跟这个类似????bsd的有没有解决方式????
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107523
QQ
发表于 2018-8-3 17:58:19 | 显示全部楼层
xujun 发表于 2018-8-3 16:40
这个问题的情况比较多,整理下:
为了客户端跟服务器的长时间连接,会使能keep-alive,保证长时间连接。这 ...

我使用这个例子测试,效果很好啊,看下效果:
V6-1027_RL-TCPnet实验_BSD Socket客户端之TCP(RTX)
GIF图片,我不断的断开连接,每次都可以及时重连上,看端口号是在不断的变化的。
1.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-4 17:00 , Processed in 0.211638 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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