为什么我在客户端使用bind总是失败呢?

qingfeng_happy5 2010-01-12 11:28:23
我在开发一个客户端软件,该软件在登录前会检查机器的网卡数目,并在窗口中显示出来,允许用户从中选择一个网卡。为了支持这个功能,所以我在进行TCP连接前,connect()前调用了bind()函数将客户端套接字绑定到了用户指定的那个网卡的IP上,现在我遇到的问题是:

机器有两个网卡A和B,A网卡接了网线,B网卡没接网线,当登陆软件后选择使用A网卡时,软件运行正常。
此时关闭软件,然后再次登录,选择B网卡,由于B没接网线,所以bind失败,客户端与服务器连接不上,这是正确的。
再次关闭软件,然后选择A网卡,但此时跟踪调试发现,bind总是失败,返回错误码是10022,解释为:提供了一个无效的参数。
我不明白为什么会这样呢?可以肯定当我第三次登录软件时,bind函数的参数中的地址确实是我选择的A网卡的地址,为什么不让我绑定了呢?A网卡应该是可用的啊。请大家给指点一下啊。
...全文
1765 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
av007007 2010-01-12
  • 打赏
  • 举报
回复
up
七十二寨寨主 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qingfeng_happy5 的回复:]
SO_REUSEADDR这个地址可重用属性在客户端也可以用吗?我看到的资料上说,只有在服务器端使用才有效啊。
[/Quote]

说只在服务器上有效的是胡说,那个是设置套接字属性的
qingfeng_happy5 2010-01-12
  • 打赏
  • 举报
回复
SO_REUSEADDR这个地址可重用属性在客户端也可以用吗?我看到的资料上说,只有在服务器端使用才有效啊。
bragi523 2010-01-12
  • 打赏
  • 举报
回复
退出前关闭socket
设置地址可重用属性
重新开启之前shutdown
rightorwrong 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qingfeng_happy5 的回复:]
我刚才试了一下,分别创建两个TCP套接字,然后将他们绑定到同一个ip和port上,如果设置了SO_REUSEADDR属性,则bind成功,如果没设置,则bind失败,返回错误码:10048。

我不明白,为什么两个套接字可以绑定到同一个ip和port上呢,要是那样的话,那TCP\IP协议栈在向应用程序提交数据时,怎么确定数据该传给哪个套接字呢?
[/Quote]

如果是客户端的话,你connect是不成功的。
如果是服务端的话,就不清楚了
qingfeng_happy5 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 conry 的回复:]
在windows下给最后那个bind的socket
[/Quote]
要真是那样的话,岂不是说在开发TCP程序时,不能将两个套接字绑定到一个(ip,port)上,那样可能会导致一个套接字接收不到数据。
  • 打赏
  • 举报
回复
养成良好习惯 关闭程序时 shutdown() closesocket()
Conry 2010-01-12
  • 打赏
  • 举报
回复
在windows下给最后那个bind的socket
qingfeng_happy5 2010-01-12
  • 打赏
  • 举报
回复
我刚才试了一下,分别创建两个TCP套接字,然后将他们绑定到同一个ip和port上,如果设置了SO_REUSEADDR属性,则bind成功,如果没设置,则bind失败,返回错误码:10048。

我不明白,为什么两个套接字可以绑定到同一个ip和port上呢,要是那样的话,那TCP\IP协议栈在向应用程序提交数据时,怎么确定数据该传给哪个套接字呢?

18,356

社区成员

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

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