硬汉嵌入式论坛

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

[RL-TCPnet] BSD Socket如何在不同的线程实现收发

[复制链接]

9

主题

18

回帖

9

积分

新手上路

积分
9
QQ
发表于 2017-6-29 14:34:33 | 显示全部楼层 |阅读模式
使用BSD Socket编程,一个线程负责接收(阻塞在recv),另一个线程负责发送(由其他的事件触发),但触发发送时,send函数提示socket被锁,其他任务正在使用,应该是recv那里锁住了,应该怎样设计,才能使收发在不同的线程上呢,使用两个不同的线程是为了实时性
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107240
QQ
发表于 2017-6-29 14:44:41 | 显示全部楼层
每个任务单独使用函数socket创建一个socket。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
发表于 2018-6-14 16:33:54 | 显示全部楼层
manho9,BSD Socket在不同的线程实现收发成功了没?
回复

使用道具 举报

27

主题

27

回帖

108

积分

初级会员

积分
108
发表于 2018-7-19 16:05:27 | 显示全部楼层
本帖最后由 nofreeze 于 2018-7-19 16:13 编辑

这个今天调试了一天! 确实是,RL-TCPNET Socket 编程不能在同一个socket下 同时实现收发,两个线程一收一发也不行 ,send函数会返回楼主所说的SCK_ELOCKED错误。 最后设计了两个sock号,一个sock1给 recv线程 一个sock2给send线程,可以实现同时收发。
但这样存在一个问题,就是电脑服务器端,会显示有两个socket连接,服务器端的软件编程会不会变得复杂?   操作系统使用的是freertos,如果是rtx,会不会不存在这个问题,没测试。
另外还有一个问题,socket TCP客户端  怎么能够确定自己的端口号,就是固定客户端的端口号,而不是每次连接服务器都是随机
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107240
QQ
发表于 2018-7-19 16:51:35 | 显示全部楼层
nofreeze 发表于 2018-7-19 16:05
这个今天调试了一天! 确实是,RL-TCPNET Socket 编程不能在同一个socket下 同时实现收发,两个线程一收一 ...

1、如果是两路Socket,电脑端你就不用操心了,让做上位机的兄弟实现个类似网络助手的功能就能实现。
2、如果是在同一个任务里面,不要把recv设置成阻塞方式的,在一个任务里面查询接收就行了,而发送随时发,上午刚在V6群解决了一个这种问题。

而多任务使用同一个Socket,锁住是必然的。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-8-12 21:37:50 | 显示全部楼层
eric2013 发表于 2018-7-19 16:51
1、如果是两路Socket,电脑端你就不用操心了,让做上位机的兄弟实现个类似网络助手的功能就能实现。
2、 ...

1.如果设备充当服务器,如何实现同时收发?建立两个socket绑定同一个地址和端口,然后都打开监听?
2.把recv设置成不阻塞的方式,是不是只能屏蔽掉预定义“__RTX”?如果屏蔽掉它,那send岂不也不是阻塞的方式了?想用超时时间轮训,但基准都是秒级别的,时间太长了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107240
QQ
发表于 2018-8-13 00:22:16 | 显示全部楼层
云琴箫龙 发表于 2018-8-12 21:37
1.如果设备充当服务器,如何实现同时收发?建立两个socket绑定同一个地址和端口,然后都打开监听?
2.把 ...

1、创建一次Socket,监听数设置2。监听到一个建立一个连接。收发同时干活最好两个Socket(这里的两个是指的监听创建的2个)。

2、不用,设置recv第4个参数为MSG_DONTWAIT即可。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-8-13 10:46:36 | 显示全部楼层
eric2013 发表于 2018-8-13 00:22
1、创建一次Socket,监听数设置2。监听到一个建立一个连接。收发同时干活最好两个Socket(这里的两个是指 ...

此方式是不是还得需要客户端做出修改?比如对端需建立两个客户端?但是那端不是我们自己的设备,让他们做出修改不现实的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107240
QQ
发表于 2018-8-13 10:56:22 | 显示全部楼层
云琴箫龙 发表于 2018-8-13 10:46
此方式是不是还得需要客户端做出修改?比如对端需建立两个客户端?但是那端不是我们自己的设备,让他们做 ...

跟客户端没有任何关系。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-8-13 23:03:10 | 显示全部楼层
eric2013 发表于 2018-8-13 10:56
跟客户端没有任何关系。

可否有例程?鼓捣了半天没鼓捣明白,两个任务还是无法实现数据同时收发。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107240
QQ
发表于 2018-8-14 00:17:51 | 显示全部楼层
云琴箫龙 发表于 2018-8-13 23:03
可否有例程?鼓捣了半天没鼓捣明白,两个任务还是无法实现数据同时收发。

这个我没有做例子,如果觉得麻烦些的话,就用原始Socket吧,比较简单省事。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107240
QQ
发表于 2018-8-14 00:19:36 | 显示全部楼层
云琴箫龙 发表于 2018-8-13 23:03
可否有例程?鼓捣了半天没鼓捣明白,两个任务还是无法实现数据同时收发。

后面有精力了我再补充几个例子
回复

使用道具 举报

100

主题

275

回帖

575

积分

金牌会员

积分
575
发表于 2018-9-26 11:22:38 | 显示全部楼层
eric2013 发表于 2018-8-14 00:19
后面有精力了我再补充几个例子

我也遇到了这个问题,ADC产生的大量测量数据要发送到计算机,计算机可以发命令给单片机。但是列程里面只有一个recv在等待接收,还没搞明白如何组织才能把测量数据发给计算机。最好是用一个SOCKET实现收发。单片机做服务器,计算机做客户端,因为计算机程序也是自己写的,所有不存在其它兄弟能帮忙搞定
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 18:22 , Processed in 0.310628 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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