由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - TCP转发的问题
相关主题
嵌入式(PLC)的时区问题[合集] 几道面试问题
Java现成的distributed的lock有哪些?汇编的mov指令
初级socket问题什么叫reverse engineer 一个软件?
why int** cannot convert to const int** ?问几句汇编指令(assembly language)
C的问题,高手请指点学了c++,java,.net,还要学汇编语言吗?
About volatile in C再请教个:C变长参数的传递问题 (转载)
C怪问题一个请教几个汇编语言的问题
如何实现微秒精度的time stamp为啥C可以当汇编用,JAVA就不可以呢?
相关话题的讨论汇总
话题: labview话题: transport话题: tcp话题: relayed话题: 设备
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客
户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222
。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。
面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。
我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里
在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的
地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从
文件里读映射就行了。
一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是
在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个
包。
下面是我的修改:
我在run里面收到了包,我应该修改后转发给设备(修改后)。然后我这个run里面怎么
等待设备的包呢?类似这样行吗?
run(){
do{
request = s_Transport.readRequest();// 截获原包
relayed_request= modify(request); // 修改
c_Transport.writeMessage(relayed_request); // 转发
relayed_response = c_Transport.readResponse(); // 读设备的回答
response = modify(relayed_response); // 修改
s_Transport.writeMessage(response) // 返回给LabView
} while(true);
}
c****3
发帖数: 10787
2
你这个变路由器了,不是这么搞的。直接到raw socket上改吧
买个便宜的路由器,刷OpenWRT做个port forwarding就行了,不用写代码,这个最简单
a9
发帖数: 21638
3
你这个单线程没有异步更没有错误处理能工作就怪了。
老老实实按改2-4个星期创造点GDP不好吗?

2222

【在 b***i 的大作中提到】
: 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客
: 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222
: 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。
: 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。
: 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里
: 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的
: 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从
: 文件里读映射就行了。
: 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是
: 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个

b***i
发帖数: 3043
4
包的内容是这样的:
前面7个基本没什么用, 然后是 id,功能,寄存器地址,寄存器数量, 读写内容
我要修改的是寄存器地址外加IP地址和端口好要修改

【在 c****3 的大作中提到】
: 你这个变路由器了,不是这么搞的。直接到raw socket上改吧
: 买个便宜的路由器,刷OpenWRT做个port forwarding就行了,不用写代码,这个最简单

b***i
发帖数: 3043
5
多线程也行啊,用semaphore控制
从LabView那里读和返回
run(){
do{
request = s_Transport.readRequest();// 截获原包
relayed_request= modify(request); // 修改
sema.release() // 让另外一个线程行动
semb.acquire(); //要么接受到了,要末超时了
response = modify(relayed_response); // 修改
s_Transport.writeMessage(response) // 返回给LabView
} while(true);
}
向设备发送和接收
run()){
do{
sema.acquire();
c_Transport.writeMessage(relayed_request); // 转发
try{
relayed_response = c_Transport.readResponse(); // 读设备的回答
}catch(Timeout){}
semb.release();
} while(true);
}

【在 a9 的大作中提到】
: 你这个单线程没有异步更没有错误处理能工作就怪了。
: 老老实实按改2-4个星期创造点GDP不好吗?
:
: 2222

c****3
发帖数: 10787
6
你的需求没看懂,反正要改TCP地址,象你这样要两个TCP连接,一个是源设备和你程序
的,一个是你的程序和目标设备的。而且目标设备看到的连接,是来自你程序的IP.
你想要目标设备看到的连接IP还是来自源设备,就得像路由器那样工作,到raw socket
上更改IP然后转发。反正挺麻烦的,还不如用网络结构,做TCP的端口映射简单。是个
路由器都能做端口映射。

【在 b***i 的大作中提到】
: 包的内容是这样的:
: 前面7个基本没什么用, 然后是 id,功能,寄存器地址,寄存器数量, 读写内容
: 我要修改的是寄存器地址外加IP地址和端口好要修改

b***i
发帖数: 3043
7
需要修改IP, port,和数据包的内容。
修改IP是为了不改变Labview程序而可以修改数据包的内容
LabView本来访问IPA, portB,包C
原来
Labview localhost, anyport ---C---> 设备IPA, port B
但是需要修改Labview发送的包的内容成为C1
现在让LabView访问localhost, portB,我的程序在同一个计算机上监听这个端口,然后
修改C成为C1,发给IPA, portB, C1。收到设备返回的包后倒是不需要修改了,直接返
回给LabView,是本机地址,原来socket里面知道的。
LabView localhost, anyport --C--> java, localhost, portB ----C1---> 设备
IPA, portB
不需要修改LabView

socket

【在 c****3 的大作中提到】
: 你的需求没看懂,反正要改TCP地址,象你这样要两个TCP连接,一个是源设备和你程序
: 的,一个是你的程序和目标设备的。而且目标设备看到的连接,是来自你程序的IP.
: 你想要目标设备看到的连接IP还是来自源设备,就得像路由器那样工作,到raw socket
: 上更改IP然后转发。反正挺麻烦的,还不如用网络结构,做TCP的端口映射简单。是个
: 路由器都能做端口映射。

c****3
发帖数: 10787
8
还要改包的内容?
如果目标机器不关心源IP的话,你的程序也起码要两个TCP连接。一个是Labview到你的
程序的,一个是你的程序到目标机器的。你的程序把从Labview受到的数据,修改后转
发到另一个TCP连接上去。
这是TCP工作的方式,否则你的程序变成路由器了,而且不是严格的路由器,因为路由
器工作在IP层,你要修改包内容,是工作在TCP层,有点象load balancer

【在 b***i 的大作中提到】
: 需要修改IP, port,和数据包的内容。
: 修改IP是为了不改变Labview程序而可以修改数据包的内容
: LabView本来访问IPA, portB,包C
: 原来
: Labview localhost, anyport ---C---> 设备IPA, port B
: 但是需要修改Labview发送的包的内容成为C1
: 现在让LabView访问localhost, portB,我的程序在同一个计算机上监听这个端口,然后
: 修改C成为C1,发给IPA, portB, C1。收到设备返回的包后倒是不需要修改了,直接返
: 回给LabView,是本机地址,原来socket里面知道的。
: LabView localhost, anyport --C--> java, localhost, portB ----C1---> 设备

b***i
发帖数: 3043
9
刚才听说不止要改包的内容,根据Modbus协议,以前在一起的寄存器现在不在一起了,
那么以前的包如果是要读多个连续寄存器现在要改成多个包了。
还不如我用Java重写算了。

【在 c****3 的大作中提到】
: 还要改包的内容?
: 如果目标机器不关心源IP的话,你的程序也起码要两个TCP连接。一个是Labview到你的
: 程序的,一个是你的程序到目标机器的。你的程序把从Labview受到的数据,修改后转
: 发到另一个TCP连接上去。
: 这是TCP工作的方式,否则你的程序变成路由器了,而且不是严格的路由器,因为路由
: 器工作在IP层,你要修改包内容,是工作在TCP层,有点象load balancer

a9
发帖数: 21638
10
用路由器的话可能要改l7 filter

然后
接返
设备

【在 c****3 的大作中提到】
: 还要改包的内容?
: 如果目标机器不关心源IP的话,你的程序也起码要两个TCP连接。一个是Labview到你的
: 程序的,一个是你的程序到目标机器的。你的程序把从Labview受到的数据,修改后转
: 发到另一个TCP连接上去。
: 这是TCP工作的方式,否则你的程序变成路由器了,而且不是严格的路由器,因为路由
: 器工作在IP层,你要修改包内容,是工作在TCP层,有点象load balancer

c*********e
发帖数: 16335
11
ssh tcp forward?

socket

【在 c****3 的大作中提到】
: 你的需求没看懂,反正要改TCP地址,象你这样要两个TCP连接,一个是源设备和你程序
: 的,一个是你的程序和目标设备的。而且目标设备看到的连接,是来自你程序的IP.
: 你想要目标设备看到的连接IP还是来自源设备,就得像路由器那样工作,到raw socket
: 上更改IP然后转发。反正挺麻烦的,还不如用网络结构,做TCP的端口映射简单。是个
: 路由器都能做端口映射。

c*********e
发帖数: 16335
12
你在公司里,是做什么的?

2222

【在 b***i 的大作中提到】
: 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客
: 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222
: 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。
: 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。
: 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里
: 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的
: 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从
: 文件里读映射就行了。
: 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是
: 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个

c*********e
发帖数: 16335
13
地址用常量。客户要改的时候,改 常量 的值就可以了。

2222

【在 b***i 的大作中提到】
: 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客
: 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222
: 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。
: 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。
: 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里
: 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的
: 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从
: 文件里读映射就行了。
: 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是
: 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个

b*******s
发帖数: 5216
14
don't use this kind of horrible design
just modify the addresses pls

2222

【在 b***i 的大作中提到】
: 最近我们组有一个项目是LabView做的,是用TCP给一个设备通信,已经做好了。现在客
: 户需要改变所有信息的地址,就是说,原来设备存到0000的地方,他们可能要改在2222
: 。反正他们看我们的地址分配不爽,要改变。大概有不到100个地址需要改写吧。
: 面临的问题是改地址这个在Labview里面没有好的对策,就是体力活,估计2-4个星期。
: 我提出一个方案:新建一个程序,成为TCP服务器,监听LabView程序发出的信息(这里
: 在用户使用的时候,把设备地址改成本机地址),然后改变目标地址为用户设备需要的
: 地址。这个程序要用Java写,应该很简单。以后其他用户要换地址,也可以这样做,从
: 文件里读映射就行了。
: 一般的TCP通讯是这样的,在一个connectionHandler里面有一个函数run(),它应该是
: 在一个线程里面一直运行的。run里面读入一个包,是阻赛的。读到后,立刻发回一个

1 (共1页)
进入Programming版参与讨论
相关主题
为啥C可以当汇编用,JAVA就不可以呢?C的问题,高手请指点
以下两个C 代码是不是完全等价?About volatile in C
大家都用什么visualization工具看图?C怪问题一个
随手写的C程序,请指教如何实现微秒精度的time stamp
嵌入式(PLC)的时区问题[合集] 几道面试问题
Java现成的distributed的lock有哪些?汇编的mov指令
初级socket问题什么叫reverse engineer 一个软件?
why int** cannot convert to const int** ?问几句汇编指令(assembly language)
相关话题的讨论汇总
话题: labview话题: transport话题: tcp话题: relayed话题: 设备