精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
最近客户换机器运行业务平台,新机器上是多网卡多公网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地址,虽然是多网卡,但是每个网卡也不可能有一套端口,端口是操作系统层面管理的,任何一个网卡过来的数据,只要端口对,都可以发到具体的软件里。