硬汉嵌入式论坛

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

[RL-TCPnet] RL-TCPnet多连接发送问题

[复制链接]

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
发表于 2017-6-26 16:50:22 | 显示全部楼层 |阅读模式
使用RL-TCPnet多连接时,板子做server,电脑做clinet,server快速同时向多个client发送数据时会出现问题,有时候会HardFault_Handler,有时候tcp_check_send会为__FALSE,一会儿就断线了。单个连接时没有问题,慢发也没有问题。我也是按照手册那样做的,发送代码如下,请问这样写有什么问题:

        if(tcp_check_send (socket) == __TRUE)
        {
            maxlen=tcp_max_dsize (socket);
            if(maxlen<=sum)
            {
                res=1;
                return res;
            }
            else
            {
                sendbuf = tcp_get_buf(sum);
                memcpy(sendbuf,buf,sum);
                if(tcp_send (socket, sendbuf, sum)==__TRUE)
                {
                    res=0;
                    return res;
                }
                else
                {
                    res=1;
                    return res;
                }
            }
        }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2017-6-26 17:12:08 | 显示全部楼层
你这个只有一个Server,只能跟电脑端的一个Client建立连接。
回复

使用道具 举报

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
 楼主| 发表于 2017-6-26 17:20:40 | 显示全部楼层
这里只是其中一段代码,我有多个socket的,这个只是一个发送函数,这里的socket是发送函数的一个参数,发送函数这样写没有问题吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2017-6-26 17:21:57 | 显示全部楼层

回 manho9 的帖子

manho9:这里只是其中一段代码,我有多个socket的,这个只是一个发送函数,这里的socket是发送函数的一个参数,发送函数这样写没有问题吧 (2017-06-26 17:20)
这个原始socket函数仅支持单任务,这点特别注意。

bsd socket才支持多任务。
回复

使用道具 举报

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
 楼主| 发表于 2017-6-26 17:24:11 | 显示全部楼层
用一个任务做处理
void mytcpip_tcp_send_task(void *pvParameters)
{
    u8 i;
    for(i=0;i<MYTCPIP_SOCKET_MAX;i++)
    {
        struct mytcpip_socket_struct* socket_sct=&mytcpip_socket_sct;
        if(socket_sct->mode==MYTCPIP_TCP_SERVER)
        {
            socket_sct->socket=tcp_get_socket (TCP_TYPE_SERVER|TCP_TYPE_KEEP_ALIVE, 0, 10, mytcpip_tcp_callback);
            if(socket_sct->socket!=0)
            {
                tcp_listen (socket_sct->socket, socket_sct->locport);
            }
        }
    }
    while(1)
    {
               vTaskDelay(10);
        for(i=0;i<MYTCPIP_SOCKET_MAX;i++)
        {
            struct mytcpip_socket_struct* socket_sct=&mytcpip_socket_sct;
            if(socket_sct->enable==1)
            {
                 mytcpip_tcp_send(socket_sct->src_buf_struct->buf,1000,socket_sct->socket,socket_sct->mode);
            }
        }
    }
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2017-6-26 17:51:08 | 显示全部楼层

回 manho9 的帖子

manho9:用一个任务做处理
void mytcpip_tcp_send_task(void *pvParameters)
{
    u8 i;
    for(i=0;i<MYTCPIP_SOCKET_MAX;i++)
....... (2017-06-26 17:24) 
那就多试试,不一定那个环节出问题了。
回复

使用道具 举报

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
 楼主| 发表于 2017-6-27 10:05:54 | 显示全部楼层
在tcp_send前后保护临界区,然后就没有问题了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2017-6-27 10:24:40 | 显示全部楼层

回 manho9 的帖子

manho9:在tcp_send前后保护临界区,然后就没有问题了 (2017-06-27 10:05) 
通过加中断解决?这个的确有些问题了,估计程序设计哪里有问题。这种原始socket的方式,主运行函数main_TcpNet一定要一直调用着,而且必须是跟你的这些原始socket函数在一个任务里面一起调用,因为原始socekt函数是不支持多任务的。
回复

使用道具 举报

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
 楼主| 发表于 2017-6-27 11:05:32 | 显示全部楼层
是的,tcp_send前关,tcp_send后开,我是通过事件方式调用main_TcpNet的,目前还没有发现问题,继续测试下
回复

使用道具 举报

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
 楼主| 发表于 2017-6-27 11:07:46 | 显示全部楼层
正常来说,使用事件方式调用main_TcpNet,是不是只能使用BSD Socket?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2017-6-27 11:12:09 | 显示全部楼层

回 manho9 的帖子

manho9:正常来说,使用事件方式调用main_TcpNet,是不是只能使用BSD Socket? (2017-06-27 11:07) 
也可以用原始socket,不过比较麻烦,不像bsd socket那么省事。得需要你安排下,看看怎么组合到一起。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 08:17 , Processed in 0.209491 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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