如何使用两个Modem各自独立发送数据?

touboc 2005-06-23 06:00:37
【硬件连接】:一台PC机(安装Windows2000 professional),使用主板自带两个串口(COM1,COM2)连接两个Modem
【操作】:分别连接电话线,拔号上网,
【现象】:可以获得两个IP地址,分别使用两个IP地址绑定Socket发送数据时,观察两Modem的指示灯(SD,RD),其中SD表示Send Data,RD表示Receive Data,只有一个Modem(SD,RD)不停闪烁,另一个Modem只有(RD)不停闪烁,RD只是偶尔闪烁.
【问题】我认为这可能是由于所有发送的数据都只是通过一个Modem传送造成的,
【目标】希望通过某种手段,分别使两条线路各自独立传输数据,二者互不干扰
【注】:我考虑了以下因素
   ①可能与windows操作系统提供的Adaptive Load Balancing(自动负载平衡)服务有关.
   ②用否可以用多串口卡来替代.
...全文
177 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
newbiestar 2005-07-15
  • 打赏
  • 举报
回复
可能的确存在这样的问题……

FreeBSD里面就不允许多个地址出现在一个子网……

Windows虽然不说,但是可能也存在这样的问题……你试试看分别使用两个ISP……
touboc 2005-07-13
  • 打赏
  • 举报
回复
from: touboc(2005.7.13)

1,经过一番实践,发现以上描述现象可能同Route table(系统路由表)相关.
2,可以使用命令【route print】显示Windows操作系统当前维护的Route Table
3,使用命令【route add Destination_IP mask 255.255.255.255 local_IP】分别将每个Modem所获得IP添加到Route表中,其中【Destination】表示数据所要发送的目的IP地址,【local_IP】表示Modem拔号所获得的IP地址.
4,经过以上操作,就可以分别指定发送数据的路径.
touboc 2005-06-27
  • 打赏
  • 举报
回复
from :touboc(2005.6.27)
to:newbiestar
1,首先说明一下,两个modem都是正常的,单独拔号上网,发送数据都没有问题.
2,【实验结果说明】
2.1如果modem1,modem2同时拔号上网,即时不使用modem1获得IP,而仅仅使用modem2拔号获得IP绑定的Socket发送数据,观察两个Modem指示灯,还是modem1的SD,RD都闪烁,而modem2的SD,RD都不闪烁,
2.2如果同时使用两个modem获得IP绑定的Socket分别发送数据的话,modem1的SD,RD都闪烁,而modem2的RD偶尔闪烁,SD不闪烁.
newbiestar 2005-06-27
  • 打赏
  • 举报
回复
那你看看单独绑定地址2是否有用,是否Modem2就会发送数据

理论上如果出现你说的情况的话,应该两个modem发送数据的几率是相同的
touboc 2005-06-27
  • 打赏
  • 举报
回复
from:touboc(2005.6.27)
to:newbiestar

正如你说的分别两次运行程序,第二个Modem使用的程序与第一个完全相同的,只是在使用CSocket.Create方法时,参数1(本地端口)与参数3(本地IP)不同.本来设计时,认为二个进程之间互相独立,二者互不干扰,但实际使用时,却出现了以上描述的Modem奇怪的工作状态.
起初问题产生时,我将调查重点放在【拔号连接】属性设置上,但没有结果.
touboc 2005-06-24
  • 打赏
  • 举报
回复
from:touboc
to:newbiestar

你好:
对于操作过程,我可能说得还不太清楚,再明确一下:
①一台PC机(安装Windows2000),连接两个Modem
②拔号上网,运行ipconfig.exe(位于winnt\system32\下),可以得到两个Modem 分别获得的两个IP信息
③运行程序smtp3(使用java编写,后附源代码)用以下构造方法构造Socket
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
参数1:InetAddress.getByName("smtp.microsoft.com.cn")//this is a joke
参数2:25
参数3:InetAddress.getByName("64.233.189.104")//使用Modem1获得IP
参数4:5555
④运行程序smtp4(使用java编写,smtp4只是smtp3的拷贝,更换类名称)用以下构造方法构造Socket
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
参数1:InetAddress.getByName("smtp.microsoft.com.cn")//this is a joke
参数2:25
参数3:InetAddress.getByName("64.233.189.105")//使用Modem2获得IP
参数4:6666
⑤观察Modem指示灯工作状态
Modem1(SD,RD)不停闪烁
Modem2只有(RD)不停闪烁,RD只是偶尔闪烁
⑥分析
可能是由于所有发送的数据都只是通过Modem1传送造成的

附录1:(smtp3.java)对于smtp4.java,只是smtp3.java的拷贝,更换一下类名
import java.net.*;
import java.io.*;

public class smtp3
{
public static void main(String args[])throws IOException
{
/*①must be changed*/
Socket socket1=new Socket(InetAddress.getByName("smtp.microsoft.com"),25,//joke
InetAddress.getByName("64.233.189.104"),5555);
try
{
System.out.println("Connection to server accepted:"+socket1);
PrintWriter out=new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket1.getOutputStream())),true);
BufferedReader in=new BufferedReader(
new InputStreamReader(socket1.getInputStream()));

String response =in.readLine();
System.out.println(response);

out.println("EHLO LOCALHOST");
response=in.readLine();
System.out.println(response);

out.println("AUTH LOGIN ");
response=in.readLine();
System.out.println(response);

out.println("abcdef");/*②must be changed*/
response=in.readLine();
System.out.println(response);

out.println("abcdef");/*③must be changed*/
response=in.readLine();
System.out.println(response);

out.println("MAIL FROM: <touboc@microsoft.com>");/*④must be changed*/
response=in.readLine();
System.out.println(response);

out.println("RCPT TO: <touboc@microsoft.com>");/*⑤must be changed*/
response=in.readLine();
System.out.println(response);

out.println("DATA");
response=in.readLine();
System.out.println(response);

out.println("Subject: test");

out.println(".");
response=in.readLine();
System.out.println(response);

out.println("QUIT");
response=in.readLine();
System.out.println(response);

socket1.close();
}//endTry
catch(Exception e)
{}
}//endMain
}//endClass

【说明】smtp3.java需要经过修改,才能运行,如何修改参见以下内容:
    ①Socket绑定的SMTP服务器以及本地IP
    ②SMTP服务器登陆帐号
    ③SMTP服务器登陆密码
    ④发送邮件地址
    ⑤接收邮件地址

newbiestar 2005-06-24
  • 打赏
  • 举报
回复
这里没有看到你使用第二个Modem的IP的代码阿……

你是两次分别运行绑定两个IP?
touboc 2005-06-24
  • 打赏
  • 举报
回复
from:touboc(2005.6.24)
to:newbiestar
抱歉,发送的是Java代码,起初是用VC+MFC开发的(后附代码),但经过测试,程序运行速度特别慢,我认为可能是由于数据缓存Buffer设置不当造成的,直到现在也没有解决,后来用Java进行了改写,经测试程序运行速度还可以.

关于ipconfig输出结果,内容如下:
<!!!出于某种原因,我对ipconfig结果进行了整理,但决不会产生歧义,望见谅>
Windows 2000 IP Configuration

Host Name . . . . . . . . . . . . : MICROSOFT1832
Primary DNS Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Broadcast
IP Routing Enabled. . . . . . . . : Yes
WINS Proxy Enabled. . . . . . . . : No

PPP adapter tst1:

Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
Physical Address. . . . . . . . . : 00-53-45-00-00-00
DHCP Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 239.149.3.72
Subnet Mask . . . . . . . . . . . : 255.255.255.255
Default Gateway . . . . . . . . . : 239.149.3.72
DNS Servers . . . . . . . . . . . : 239.150.32.132
239.146.0.130

PPP adapter tst2:

Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
Physical Address. . . . . . . . . : 00-53-45-00-00-00
DHCP Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 239.149.3.73
Subnet Mask . . . . . . . . . . . : 255.255.255.255
Default Gateway . . . . . . . . . : 239.149.3.72
DNS Servers . . . . . . . . . . . : 239.150.32.132
239.146.0.130

[====================================================================================]
附录1:smtp5.cpp ,使用命令行:cl /MT smtp5.cpp 可以编译通过.

#include <afxsock.h>
#include <iostream.h>

int main()
{
AfxSocketInit();

CSocket socket;
BOOL btn=socket.Create(5555,
SOCK_STREAM,
"64.233.189.104");
CString szTmp;
szTmp.Format("Create Process:%d",btn);
cout<<szTmp<<endl;

btn=socket.Connect("smtp.microsoft.com.cn",25);
szTmp.Format("Connect Process:%d",btn);
cout<<szTmp<<endl;

char caReceivedBuf[150];
const int iBufLen =150;
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf);

socket.Send("HELO LOCALHOST",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("AUTH LOGIN",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("abcdef",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("abcdef",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("MAIL FROM: <touboc@microsoft.com.cn>",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("RCPT TO: <touboc@microsoft.com.cn>",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("DATA",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("This is a mail message",100);

socket.Send(".",100);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Send("QUIT",sizeof("QUIT")+1);
socket.Receive(caReceivedBuf,iBufLen);
cout<<CString(caReceivedBuf)<<endl;

socket.Close();
return 1;
}
newbiestar 2005-06-24
  • 打赏
  • 举报
回复
居然是Java的代码……

你把你的ipconfig的输出给我看看,只用一个modem输入输出是没有道理的
newbiestar 2005-06-23
  • 打赏
  • 举报
回复
有关系吗?自动负载均衡似乎不是干这个事情的……

另外,你确定你分别绑定了两个IP吗?

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧