好久没来这里,问大侠们一个问题,关于bind的用法

stevecrisewu 2006-02-06 09:16:24
在msdn上这样描述bind函数的用法
The bind function is used on an unconnected socket before subsequent calls to the connect or listen functions. It is used to bind to either connection-oriented (stream) or connectionless (datagram) sockets. When a socket is created with a call to the socket function, it exists in a name space (address family), but it has no name assigned to it. Use bind to establish the local association of the socket by assigning a local name to an unnamed socket.

一般情况下,bind函数用于服务器端的比较多,绑定到套接字上实现监听,这没有问题。我的问题是:如果客户端有N个IP地址,创建N个套接字,并将这N个套接字分别与这些IP地址绑定,即实现了N个客户端,那么所有的基于该套接字上操作是否跟普通的创建单个客户端一样?对该套接字实现阻塞/非阻塞编程?
...全文
374 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
newbiestar 2006-02-14
  • 打赏
  • 举报
回复
我后来又看了TCP/IP Illustrated,里面的意思是路由记录只要发生一个匹配,那么数据包就会根据这条记录被转发(不知道E文原版是不是这个意思,中文版总觉得信不过……),所以会造成这样的结果。

但是我认为这个问题应该不是这样的,至少真正的路由器应该不是这么干的。
newbiestar 2006-02-13
  • 打赏
  • 举报
回复
可能是我对路由表的理解有错误……

你现在是添加两条路由记录就可以两个线路同时使用了么?
stevecrisewu 2006-02-13
  • 打赏
  • 举报
回复
newbiestar老兄快点给我看看,谢谢
stevecrisewu 2006-02-13
  • 打赏
  • 举报
回复
添加两天路由信息以后,是都能够连接了

但是它们走的都是同一个连接(通过发送数据,新添加路由的有流量,后添加的没有流量)

因此,好像只有连接不通的服务器,用这种添加路由的方式好像是可以的,但如果连接的是同一个服务器,则不行了。

添加两天路由信息之后,浏览网页依然使用的是默认网关提供的那个连接,即后拨的那个连接,但是用绑定的方式却是都是用的先前的那个连接。
stevecrisewu 2006-02-11
  • 打赏
  • 举报
回复
ipconfig输出的信息没有变化

路由表信息如下:(环回等没有给出)
0.0.0.0 0.0.0.0 10.12.28.217 10.12.28.217 2
0.0.0.0 0.0.0.0 10.13.66.26 10.13.66.26 1
10.12.28.217 255.255.255.255 127.0.0.1 127.0.0.1 50
10.13.66.26 255.255.255.255 127.0.0.1 127.0.0.1 50
10.255.255.255 255.255.255.255 10.12.28.217 10.12.28.217 50
10.255.255.255 255.255.255.255 10.13.66.26 10.13.66.26 50
192.168.111.111 255.255.255.255 10.12.28.217 10.12.28.217 1
192.168.111.111 255.255.255.255 10.13.66.26 10.13.66.26 1
221.221.158.48 255.255.255.255 10.12.28.217 10.12.28.217 1
224.0.0.0 240.0.0.0 10.12.28.217 10.12.28.217 2
224.0.0.0 240.0.0.0 10.13.66.26 10.13.66.26 1

这个时候10.12.28.217能够连接服务器,但10.13.66.26反而不行了
只有当我添加一个路由信息之后才能连接上
newbiestar 2006-02-11
  • 打赏
  • 举报
回复
再把你的路由信息、ipconfig输出贴出来……
stevecrisewu 2006-02-11
  • 打赏
  • 举报
回复
好消息

先拨的那个可以连接上服务器了

但是新问题出现了,这样添加一个路由信息以后,后拨的就不能连接上服务器了。

于是我仿照上面添加的方法给10.13.66.26也路由这么一个信息,能够连接上,

但是用到的连接却是先拨的那个,即后拨的没有流量

是否这样添加了一个路由信息之后,系统就不走默认网关了,因为已经有这么一个路由路径了?
newbiestar 2006-02-11
  • 打赏
  • 举报
回复
你路由表加错了……

如果你要到10.x.x.x的机器,那么你加的这条是正确的,但是到221.221.148.151的话,你这个就错了么……

用这个
route add 221.221.148.151 mask 255.0.0.0 10.12.28.217 metric 2 if 2

不过你要确定你的其他设置也要匹配才行(估计gprs的拨号服务器也不只那么几台,千万别把网关和interface的编号搞错了)!
stevecrisewu 2006-02-11
  • 打赏
  • 举报
回复
我连接的机器的IP是用ADSL拨号获取的,221.221.148.151

那么怎么配置一个路由表以让各个连接用各自的真实物理连接?
newbiestar 2006-02-11
  • 打赏
  • 举报
回复
1、当然是这样咯……因为默认网关的关系,导致了系统将把packet从后来创建的连接上面发送出去,那么自然第一个没有流量咯。当你的系统里面没有路由表里面没有到达目的主机的匹配表项的时候,系统就会让数据全都去默认网关。

2、你连接的机器IP是多少?
stevecrisewu 2006-02-11
  • 打赏
  • 举报
回复
同时为什么网关跟拨号获取的IP地址都是一样的?
stevecrisewu 2006-02-11
  • 打赏
  • 举报
回复
原来是这样
但是我还有些问题不是很清楚
1.拨号之后系统自动分配了一个默认网关,那么,是否可以这样认为,无论你有多少个活动的网络连接,即使绑定到各个IP地址,也无济于事?因为所有的连接都会从默认的网关寻找路由?我刚才实验时候发现,用先拨的那个连接(前面提到的例子)起自身的接受发送数据并没有增加,而是当前活动连接即后拨的那个连接的发送数据增加。

2.我用你的方法增加了一个路由,命令为route add 10.0.0.0 mask 255.0.0.0 10.12.28.217 metric 2 if 0x90005。
这样路由表里面并多了一条
Destination Mask GateWay Interfcae metric
10.0.0.0 255.0.0.0 10.12.28.217 10.12.28.217 2
添加成功以后,还是不行,绑定到IP以后,依然显示连接超时,而后拨的那个连接的发送字节数增加
stevecrisewu 2006-02-10
  • 打赏
  • 举报
回复
我有两个GPRS modem,分别为A和B,现在有一台服务器C,在C上运行服务程序,发现只有AB后拨号的那个才能跟C通信,先拨的那个总会出现连接服务器超时(10060错误)

下面是客户端的连接方法
//变量定义
SOCKADDR_IN m_sockCntAddr,ska;
DWORD dwIp;//服务器IP
char buf[20];//需要绑定的IP地址

m_sockCntAddr.sin_family=AF_INET;
m_sockCntAddr.sin_addr.s_addr=ntohl(dwIp);
m_sockCntAddr.sin_port=htons(GprsPort) ;

m_ComboIP.GetWindowText(buf,20);
ska.sin_family=AF_INET;
ska.sin_port=htons(GprsPort);
ska.sin_addr.s_addr=inet_addr(buf);

if(bind(GprsSocket,(SOCKADDR*)&ska,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
dwIp=WSAGetLastError();
str.Format("bind-%lu",dwIp);
MessageBox(str);
return ;
}
if(connect(GprsSocket,(LPSOCKADDR)&m_sockCntAddr,sizeof(m_sockCntAddr)) == SOCKET_ERROR)
{
dwIp=WSAGetLastError();
str.Format("connect-%lu",dwIp);
MessageBox(str);
return ;
}

请问我的问题在哪里,谢谢!
newbiestar 2006-02-10
  • 打赏
  • 举报
回复
想要使用第一个也不是不行,但是要用route自己改路由表……比较麻烦……

先用route print察看你的接口,然后用route add添加路由表项……譬如

route add x.x.x.x mask 255.0.0.0 10.12.28.217 metric 2 if 2

这个是给到从编号为2的interface(if)到x.x.x.x/8的网络,添加一个传输开销(metric)为2的路由……

估计这样就能转了……不过这样十分麻烦,每次建立了连接都要这么搞一下……
newbiestar 2006-02-10
  • 打赏
  • 举报
回复
我就说么……

你看到default gateway了吧?default么,顾名思义,只有一个才叫default,两个的话当然只能取一个作为默认网关,Windows采用的是使用后添加的那个,然后覆盖了前面的那个。当你的应用bind到第一个IP的时候,此时已经没有路径可以到达你所要连接的机器,当然就会超时喽……

但是如果你的运气足够好,两次拨号得到的default gateway是同一个,那么无论绑定在哪个IP上面,都应该可以连接的。
stevecrisewu 2006-02-10
  • 打赏
  • 举报
回复
windows IP Configuration

Host Name...........................: upward
Primary Dns Suffix..................:
Node Type...........................: Unknown
IP Routing Enabled..................: No
WINS Proxy Enabled..................: No

Ethernet adapter 本地连接:

Connection-specific DNS Suffix......:
Description.........................: Realtek RTL8139 Family PCI Fast Ethernet NIC
Physical Address....................: 00-0D-61-4D-54-E3
DHCP Enabled........................: No
IP Address..........................: 192.168.2.119
Subnet Mask.........................: 255.255.255.0
Default Gateway.....................:

PPP adapter gprs1:

Connection-specific DNS Suffix......:
Description.........................: WAN (PPP/SLIP) Interface
Physical Address....................: 00-53-45-00-00-00
DHCP Enabled........................: No
IP Address..........................: 10.12.28.217
Subnet Mask.........................: 255.255.255.255
Default Gateway.....................: 10.12.28.217
DNS Servers.........................: 221.130.33.52
221.130.33.60
NetBIOS over Tcpip..................: Disabled


-------------------------

这里是只拨一个号的时候的详细记录

-----------------------------

windows IP Configuration

Host Name...........................: upward
Primary Dns Suffix..................:
Node Type...........................: Unknown
IP Routing Enabled..................: No
WINS Proxy Enabled..................: No

Ethernet adapter 本地连接:

Connection-specific DNS Suffix......:
Description.........................: Realtek RTL8139 Family PCI Fast Ethernet NIC
Physical Address....................: 00-0D-61-4D-54-E3
DHCP Enabled........................: No
IP Address..........................: 192.168.2.119
Subnet Mask.........................: 255.255.255.0
Default Gateway.....................:

PPP adapter gprs1:

Connection-specific DNS Suffix......:
Description.........................: WAN (PPP/SLIP) Interface
Physical Address....................: 00-53-45-00-00-00
DHCP Enabled........................: No
IP Address..........................: 10.12.28.217
Subnet Mask.........................: 255.255.255.255
Default Gateway.....................: 10.12.28.217
DNS Servers.........................: 221.130.33.52
221.130.33.60
NetBIOS over Tcpip..................: Disabled

PPP adapter gprs2:

Connection-specific DNS Suffix......:
Description.........................: WAN (PPP/SLIP) Interface
Physical Address....................: 00-53-45-00-00-00
DHCP Enabled........................: No
IP Address..........................: 10.13.66.26
Subnet Mask.........................: 255.255.255.255
Default Gateway.....................: 10.13.66.26
DNS Servers.........................: 221.130.33.52
221.130.33.60
NetBIOS over Tcpip..................: Disabled

--------------------------------

这里是拨两个号码的时候的情况

--------------------------------


对于拨一个号,能够连接到服务器,这个没有问题
拨两个号时候,后拨的才能连接到服务器

你帮我看看巴,看看哪里出的问题,谢谢
stevecrisewu 2006-02-10
  • 打赏
  • 举报
回复
windows IP Configuration

Host Name...........................: upward
Primary Dns Suffix..................:
Node Type...........................: Unknown
IP Routing Enabled..................: No
WINS Proxy Enabled..................: No

Ethernet adapter 本地连接:

Connection-specific DNS Suffix......:
Description.........................: Realtek RTL8139 Family PCI Fast Ethernet NIC
Physical Address....................: 00-0D-61-4D-54-E3
DHCP Enabled........................: No
IP Address..........................: 192.168.2.119
Subnet Mask.........................: 255.255.255.0
Default Gateway.....................:

PPP adapter gprs1:

Connection-specific DNS Suffix......:
Description.........................: WAN (PPP/SLIP) Interface
Physical Address....................: 00-53-45-00-00-00
DHCP Enabled........................: No
IP Address..........................: 10.12.28.217
Subnet Mask.........................: 255.255.255.255
Default Gateway.....................: 10.12.28.217
DNS Servers.........................: 221.130.33.52
221.130.33.60
NetBIOS over Tcpip..................: Disabled

PPP adapter gprs2:

Connection-specific DNS Suffix......:
Description.........................: WAN (PPP/SLIP) Interface
Physical Address....................: 00-53-45-00-00-00
DHCP Enabled........................: No
IP Address..........................: 10.13.66.26
Subnet Mask.........................: 255.255.255.255
Default Gateway.....................: 10.13.66.26
DNS Servers.........................: 221.130.33.52
221.130.33.60
NetBIOS over Tcpip..................: Disabled
newbiestar 2006-02-10
  • 打赏
  • 举报
回复
只要你的数据出去了,并且不是到你所在子网的任何一台机器,这个时候就牵涉到路由的设置问题了

你把你的ipconfig /all的输出贴出来,解决问题的关键很可能就在这里(分别给出只有一个连接,和两个都连接时候的输出)
stevecrisewu 2006-02-10
  • 打赏
  • 举报
回复
恕我愚昧,再详细的信息是什么?

我这里没有牵涉到路由什么的巴

我这里就是在系统里面创建了两个网络连接,然后都拨号上网,即系统有了A,B两个活动的网络连接,同时在另外一台机器上(连接到互联网)运行我的服务器程序实现监听,发现后拨号的网络连接能够连接上我的服务器,先拨的就是我上面提到的超时!

上面我也贴出了我的客户端程序连接方法

关于其他的详细信息我还真不知道是什么,请明示
newbiestar 2006-02-10
  • 打赏
  • 举报
回复
还是把详细的信息贴出来比较好

这个问题我初步怀疑是路由造成的……
加载更多回复(12)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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