winsock2api関数のgetnameinfoに問題があります。
私は次のようなファイルを含むCISocketという名前のクラスを持っています:
vector<char>* ip;
と名前のソケットを作成するための関数があります:
CreateSocket(const vector<char>* ipA,unsigned short nPort,SocketType stype,bool nonBlocking,bool bBindSocket)
{
...
struct addrinfo *result = 0;
struct addrinfo *ptr = 0;
//The addrinfo structure is used by the getaddrinfo function to hold host address information
struct addrinfo hints;
char local_hostname[1025];
const vector<char>* host = ipA;
....
ZeroMemory(&hints,sizeof(hints));
hints.ai_family = IsIPv46Socket() ? AF_UNSPEC : (IsIPv6Socket() ? AF_INET6 : AF_INET);
hints.ai_socktype = IsStream() ? SOCK_STREAM : SOCK_DGRAM;
hints.ai_protocol = IsStream() ? IPPROTO_TCP : IPPROTO_UDP;
hints.ai_flags = AI_PASSIVE
#if !IRNET_UNDER_WINDOWS || _WIN32_WINNT>=0x600
| AI_ADDRCONFIG
#endif
getaddrinfo(local_hostname,port,&hints,&result)
for (ptr=result;ptr;ptr=result->ai_next)
{
....
vector<char>::pointer chPtr = ip->data();
if (status = GetIPAndPort(this->fd,/*&(*this->ip)*/&(*chPtr),&this->port))
{
char* err = gai_strerrorA(status);
cout<< "Failed To Get Local IP and port.";
CloseSocket(&this->fd);
continue;
}
}
}
この関数の内部から、GetIPAndPortという名前の別のメソッドを呼び出します
GetIPAndPort( int32_t fd,__out /*vector<char>*/char* ip,__out uint16_t* nPort )
{
if (nPort)
{
*nPort = 0;
}
if (this->fd > 0)
{
int status;
struct sockaddr_storage ss;//retrieved transport address holder
if (status = GetSocketAddress(this->fd,&ss))
{
//cout<< "GetSocketAddress has failed with status code: %d", status"
return -1;
}
int ret = GetSocketIPAndPort((struct sockaddr*)&ss,ip,nPort);
return ret;
}
}
この方法で主な問題が発生します:
GetSocketIPAndPort( struct sockaddr* ss, char* pIP, uint16_t* nPort )
{
int status = -1;
/*typedef char ip_t[65];
ip_t* pip ={0};
vector<char>* chr = new vector<char>(65);
vector<char>::pointer ptr = pIP->data();*/
if (ss->sa_family == AF_INET)
{
sockaddr_in *sin = (struct sockaddr_in*)ss;
if (nPort)
{
*nPort = Endianness::HostToNetwork(sin->sin_port);
status = 0;
}
if (pIP)
{
if (status = getnameinfo((struct sockaddr*)&sin,sizeof(sockaddr),pIP,/*sizeof(*pIP)*/1025,0,0,NI_NUMERICHOST))
{
char* serr = gai_strerrorA(status);
return status;
}
}
}
}
このメソッドでは、getnameinfoがエラーを呼び出したときに次のようになります。
要求されたプロトコルと互換性のないアドレスが使用されました。
このエラーをどのように解決できますか?私の間違いは何ですか?