首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

Libjingle一个虽小但却很严重的bug - 误导人的SocketAddress构造函数参数姓名

2012-07-28 
Libjingle一个虽小但却很严重的bug - 误导人的SocketAddress构造函数参数名称在Libjingle+Linphone for Wi

Libjingle一个虽小但却很严重的bug - 误导人的SocketAddress构造函数参数名称

在Libjingle+Linphone for Windows的voice call测试中, 遇到了一些问题. 而这些问题的root cause竟然源于Google code的一些小bug. 这里先指出一个.

?

SocketAddress这个类的其中一个构造函数是:

SocketAddress::SocketAddress(const std::string& hostname, int port) {  SetIP(hostname);  SetPort(port);}void SocketAddress::SetIP(const std::string& hostname) {  hostname_ = hostname;  ip_ = StringToIP(hostname);}uint32 SocketAddress::StringToIP(const std::string& hostname) {  uint32 ip = 0;  StringToIP(hostname, &ip);  return ip;}bool SocketAddress::StringToIP(const std::string& hostname, uint32* ip) {  in_addr addr;  if (inet_aton(hostname.c_str(), &addr) == 0)    return false;  *ip = NetworkToHost32(addr.s_addr);  return true;}#ifdef WIN32// Win32 doesn't provide inet_aton, so we add our own version here.// Since inet_addr returns 0xFFFFFFFF on error, if we get this value// we need to test the input to see if the address really was 255.255.255.255.// This is slightly fragile, but better than doing nothing.int inet_aton(const char* cp, struct in_addr* inp) {  inp->s_addr = inet_addr(cp);  return (inp->s_addr == INADDR_NONE &&          strcmp(cp, "255.255.255.255") != 0) ? 0 : 1;}#endif  // WIN32

?hostname被传递的顺序是SocketAddress()->SetIP()->StringToIP()->inet_aton()->inet_addr()

?

那我们再来看看inet_addr()的说明, 这是一个系统函数. Refer to:

http://msdn.microsoft.com/en-us/library/ms738563%28v=vs.85%29.aspx

写道The inet_addr function converts a string containing an IPv4 dotted-decimal address into a proper address for the IN_ADDR structure.
Parameters

cp [in]

A NULL-terminated character string representing a number expressed in the Internet standard ".'' (dotted) notation.

?也就是说inet_addr()函数的参数是一个IP地址字符串, 如"192.168.1.1".

?

而SocketAddress类的构造函数的参数按照字面意思应该是hostname (主机名),? 所以如果传入hostname, 最终inet_addr()函数将无法正确解析, 那么构造的对象将会代表一个无效的地址.

?

偶被这个隐藏的小bug捉弄了好几天, 差点放弃Libjingle的测试, 幸亏最终静下心来仔细分析了一下.? 如果传入hostname (比如"localhost") 构造这样一个SocketAddress对象, 然后调用SendTo()发送数据, 会返回-1, 系统错误码为WSAEADDRNOTAVAIL (10049) Cannot assign requested address.

写道被请求的地址在它的环境中是不合法的。通常地在bind()函数试图将一个本地机器不合法的
地址绑扎到套接字时产生。它也可能在connect()、sendto()、WSAConnect()、WSAJoinLeaf()
或WSASendTo()函数调用时因远程机器的远程地址或端口号非法(如0地址或0端口号)而
产生。?

?

?

热点排行