精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
最近客户换机器运行业务平台,新机器上是多网卡多公网IP配置,每个网卡有一组监听连接和客户连接,自己发的连接(客户端)也需要绑定到具体的一个网卡上,中间遇到很多次10049问题。
最简单的制造问题办法就是指定个错误的ip来bind,则肯定遇到10049,有时候配置文件换到新机器上,配置信息里的ip和新机器不一样,不对应绑定就出这个10049问题。用ipconfig确认好地址就可以解决此类问题。
另外有些网卡虽然有地址,也不能绑定,比如无线网卡上强制bind,也会10049,我特意做了测试。
一般来说,客户端连接时指定网卡ip,能够通过,服务器端模式需要listen前的bind就经常出错。
C++写的bind代码示例如下:
//获取Host的IP地址等信息 ADDRINFOT aiHints; ZeroMemory(&aiHints, sizeof(ADDRINFOT)); aiHints.ai_family = AF_INET; aiHints.ai_flags = AI_PASSIVE; aiHints.ai_protocol = 0; aiHints.ai_socktype = SOCK_STREAM; PADDRINFOT paiResult; GetAddrInfo(StringToWstring(cip).c_str(), NULL, &aiHints, &paiResult); sSocket = socket(AF_INET, SOCK_STREAM, 0); if (sSocket == SOCKET_ERROR) { //std::wcout << "Error socket" << std::endl; return _T("创建socket失败"); } struct sockaddr_in sinSelf; memset(&sinSelf, 0, sizeof(sockaddr_in)); sinSelf.sin_family = AF_INET; sinSelf.sin_port = htons(0); sinSelf.sin_addr.s_addr = inet_addr(pSelfip); if (-1 == ::bind(sSocket, (struct sockaddr*)&sinSelf, sizeof(sockaddr_in))) { closesocket(sSocket); return _T("客户端绑定自己IP失败"); }
向s_addr赋值可以用inet_addr来替换掉,不影响功能。
用netstat -an可以确认是否已经绑定到具体的端口。
多网卡时,监听用bind可以用any地址,虽然是多网卡,但是每个网卡也不可能有一套端口,端口是操作系统层面管理的,任何一个网卡过来的数据,只要端口对,都可以发到具体的软件里。