首页 新闻 会员 周边 捐助

C#下Socket编程 多网卡/ip的客户端跟服务端通信 如何指定IP访问服务端

1
悬赏园豆:80 [已解决问题] 解决于 2013-03-07 09:09

long story short

背景:我的工作台器有俩网卡/ip,现在写了个socket的程序跟局域网里的另一台机器通信。
假设我的俩ip为:172.16.10.41(有线);192.168.1.14(无线)

现在另一台机器(ip:172.16.10.47)拿服务端程序开启监听,我的机器连接那台机器,服务端拿到通信套接字 点出RemoteEndPoint就是我这边的ip  现在就想知道如何指定这个ip(默认连接都是我这边的有线ip 即:172.16.10.41)

服务端代码:

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse("172.16.10.47");
IPEndPoint endpoint = new IPEndPoint(address, 2000);
socketWatch.Bind(endpoint);
socketWatch.Listen(10);
MessageBox.show("服务端开始监听...");
Socket sokConnection = socketWatch.Accept();   //接收客户端连接请求
MessageBox.show("连接成功,客户端IP为:" + sokConnection.RemoteEndPoint.ToString());    //这里收到的总是客户端的有线IP
 
客户端代码:
IPAddress address = IPAddress.Parse("172.16.10.47");
IPEndPoint endpoint = new IPEndPoint(address, 2000);
Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketClient.Connect(endpoint);   //向服务端发送连接请求(这里默认就用了有线连接)
 
现在就是想知道:多IP的客户端如何指定ip连接服务端
talk is easy,show your code...
 
[quote]
问题之外的话:写这个小工具的小目的是为了测试某路由器的抗压性 发送大量伪数据(10G左右)来回经过路由器 要在一台双网卡的机器上跑 一个ip 发 另一个ip收,由于微软底层的一些东西 判断是同一台机器收发数据 不经过路由器了(表现:任务管理器里网络的看视窗没任何波动)

如果有这个问题的解决方案也可以提,谢谢
[/quote]
 
 
2013.3.7 编辑:问题在于有线和无线的ip不在同一个网段内,局域网的另一台机器其实连ping都ping不通我的无线ip,telnet也连不上,这是基本常识了。
如果在同一个网段内,应该是可以指定客户端两个ip的其中一个来连接服务端的,等我有两个在同一网段的网卡再做实验吧。下面的酌情给分了,最佳答案我并未实验
放上csdn上的回答,方便给后来搜索的人一些参考:http://bbs.csdn.net/topics/390383397
oppoic的主页 oppoic | 小虾三级 | 园豆:770
提问于:2013-03-06 10:54
< >
分享
最佳答案
0

是指定输出数据的ip吧?没遇到过。查了下,你看看有用不(都说是通过指定路由器输出来实现的):

http://bbs.csdn.net/topics/300136771

http://zhidao.baidu.com/question/96193240.html

收获园豆:60
滴答的雨 | 老鸟四级 |园豆:3660 | 2013-03-06 11:28
其他回答(3)
0

客户端用binding ip就可以了

IPAddress[] ipAddress = Dns.GetHostAddresses(_host);  

IPEndPoint remoteEP = newIPEndPoint(ipAddress[0], _port);

socketClient = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);           

if (_ClientIP != null && _ClientIP != ""){

  IPEndPoint localIPE = newIPEndPoint(IPAddress.Parse(_ClientIP), 0);

  socketClient.Bind(localIPE);

}

socketClient.BeginConnect(remoteEP, newAsyncCallback(ConnectCallback), socketClient);

connectDone.WaitOne();

收获园豆:10
s zhang | 园豆:221 (菜鸟二级) | 2013-03-06 11:13
0

这个问题是根据你本机的路由表来决定的,不能直接指定本机用哪个IP通信。除非你自己编辑自己机器的路由表才有可能实现。

收获园豆:10
害怕飞的鸟 | 园豆:275 (菜鸟二级) | 2013-03-06 13:23
0

IPAddress.Any

 

new IPEndPoint(address, 2000) => new IPEndPoint(IPAddress.Any, 2000)

K.NET | 园豆:104 (初学一级) | 2013-03-06 21:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册