Всем привет, задачу переделываю чтобы работала на Windows XP и возникла небольшая трудность. Функции Win API InetNtop и InetPton отсутствуют в Win XP хочу заменить их на WSAAddressToString и WSAStringToAddress вот собственно код:
//!Convertor IN_ADDR or IN6_ADDR to CString. Argument addr cast from IN_ADDR or IN6_ADDR, in argument Family set the AF_INET or AF_INET6
inline bool Ip2Str(PVOID addr, CString &ip, CString &err_msg, INT Family = AF_INET){
bool ret_val(false);
TCHAR ip_[MAX_ADDRESS_STRING_LENGTH] = { '\0' };
if (InetNtop(Family, addr, ip_, MAX_ADDRESS_STRING_LENGTH)){
ip = ip_;
ret_val = true;
}
else{
err_msg = GetErrMsg(WSAGetLastError());
}
return ret_val;
}
//!Convertor from CString ip address to IN_ADDR or IN6_ADDR. Argument addr cast from IN_ADDR or IN6_ADDR, in argument Family set the AF_INET or AF_INET6
inline bool Str2Ip(const CString &ip, PVOID *addr, CString &err_msg, INT Family = AF_INET){
bool ret_val(false);
if (InetPton(Family, ip, addr)){
ret_val = true;
}
else{
err_msg = GetErrMsg(WSAGetLastError());
}
return ret_val;
}
Что бы заменить функции InetNtop и InetPton на WSAAddressToString и WSAStringToAddress в моем случае нужно преобразовать IN_ADDR в SOCKADDR и наоборот, кто в курсе как это сделать подскажите плиз.
Спасибо.
Здравствуйте, _agg, Вы писали:
_>Что бы заменить функции InetNtop и InetPton на WSAAddressToString и WSAStringToAddress в моем случае нужно преобразовать IN_ADDR в SOCKADDR и наоборот, кто в курсе как это сделать подскажите плиз.
_>Спасибо.
Convert IP address from sockaddr to in_addr
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, _agg, Вы писали:
Вопрос снят, вот такое решение:
//!Convertor IN_ADDR or IN6_ADDR to CString. Argument addr cast from IN_ADDR or IN6_ADDR, in argument Family set the AF_INET or AF_INET6
inline bool Ip2Str(PVOID addr, CString &ip, CString &err_msg, INT Family = AF_INET){
bool ret_val(false);
TCHAR ip_[MAX_ADDRESS_STRING_LENGTH] = { '\0' };
LPSOCKADDR sockaddr;
sockaddr_in6 sain6;
sockaddr_in sain;
ZeroMemory(&sain6, sizeof(sockaddr_in6));
ZeroMemory(&sain, sizeof(sockaddr_in));
if (Family == AF_INET){
sain.sin_addr = *(IN_ADDR *)addr;
sain.sin_family = Family;
sockaddr=(LPSOCKADDR)&sain;
}
else{
sain6.sin6_family = Family;
sain6.sin6_addr = *(IN6_ADDR *)addr;
sockaddr = (LPSOCKADDR)&sain6;
}
DWORD len(MAX_ADDRESS_STRING_LENGTH);
if (!WSAAddressToString(sockaddr, (Family == AF_INET ? sizeof(sain) : sizeof(sain6)), NULL, ip_, &len)){//if (InetNtop(Family, addr, ip_, MAX_ADDRESS_STRING_LENGTH)){
ip = ip_;
ret_val = true;
}
else{
err_msg = GetErrMsg(WSAGetLastError());
}
return ret_val;
}
//!Convertor from CString ip address to IN_ADDR or IN6_ADDR. Argument addr cast from IN_ADDR or IN6_ADDR, in argument Family set the AF_INET or AF_INET6
inline bool Str2Ip(const CString &ip, PVOID *addr, CString &err_msg, INT Family = AF_INET){
bool ret_val(false);
sockaddr_in in_addr;
sockaddr_in6 in6_addr;
ZeroMemory(&in6_addr, sizeof(sockaddr_in6));
ZeroMemory(&in_addr, sizeof(sockaddr_in));
if (Family == AF_INET){
in_addr.sin_family = Family;
in_addr.sin_addr = *(IN_ADDR*)addr;
}
else{
in6_addr.sin6_family = Family;
CopyMemory(&in6_addr.sin6_addr, addr, sizeof(IN6_ADDR));
}
int len(MAX_ADDRESS_STRING_LENGTH);
if (!WSAStringToAddress((LPWSTR)(LPCTSTR)ip, Family, NULL, (LPSOCKADDR)&in_addr, &len)){ //if (InetPton(Family, ip, addr)){
ret_val = true;
}
else{
err_msg = GetErrMsg(WSAGetLastError());
}
return ret_val;
}