我在开发一个客户端软件,该软件在登录前会检查机器的网卡数目,并在窗口中显示出来,允许用户从中选择一个网卡。为了支持这个功能,所以我在进行TCP连接前,connect()前调用了bind()函数将客户端套接字绑定到了用户指定的那个网卡的IP上,现在我遇到的问题是:  机器有两个网卡A和B,A网卡接了网线,B网卡没接网线,当登陆软件后选择使用A网卡时,软件运行正常。
  此时关闭软件,然后再次登录,选择B网卡,由于B没接网线,所以bind失败,客户端与服务器连接不上,这是正确的。
  再次关闭软件,然后选择A网卡,但此时跟踪调试发现,bind总是失败,返回错误码是10022,解释为:提供了一个无效的参数。
  我不明白为什么会这样呢?可以肯定当我第三次登录软件时,bind函数的参数中的地址确实是我选择的A网卡的地址,为什么不让我绑定了呢?A网卡应该是可用的啊。请大家给指点一下啊。

解决方案 »

  1.   

    退出前关闭socket
    设置地址可重用属性
    重新开启之前shutdown
      

  2.   

    SO_REUSEADDR这个地址可重用属性在客户端也可以用吗?我看到的资料上说,只有在服务器端使用才有效啊。
      

  3.   

    我刚才试了一下,分别创建两个TCP套接字,然后将他们绑定到同一个ip和port上,如果设置了SO_REUSEADDR属性,则bind成功,如果没设置,则bind失败,返回错误码:10048。我不明白,为什么两个套接字可以绑定到同一个ip和port上呢,要是那样的话,那TCP\IP协议栈在向应用程序提交数据时,怎么确定数据该传给哪个套接字呢?
      

  4.   

    在windows下给最后那个bind的socket
      

  5.   

    养成良好习惯 关闭程序时  shutdown()  closesocket()
      

  6.   

    要真是那样的话,岂不是说在开发TCP程序时,不能将两个套接字绑定到一个(ip,port)上,那样可能会导致一个套接字接收不到数据。
      

  7.   


    如果是客户端的话,你connect是不成功的。
    如果是服务端的话,就不清楚了