Преобразование IN_ADDR в SOCKADDR
От: _agg  
Дата: 20.08.18 05:32
Оценка:
Всем привет, задачу переделываю чтобы работала на 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 и наоборот, кто в курсе как это сделать подскажите плиз.
Спасибо.
Re: Преобразование IN_ADDR в SOCKADDR
От: Мёртвый Даун Россия  
Дата: 20.08.18 07:29
Оценка:
Здравствуйте, _agg, Вы писали:

_>Что бы заменить функции InetNtop и InetPton на WSAAddressToString и WSAStringToAddress в моем случае нужно преобразовать IN_ADDR в SOCKADDR и наоборот, кто в курсе как это сделать подскажите плиз.

_>Спасибо.

Convert IP address from sockaddr to in_addr
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: Преобразование IN_ADDR в SOCKADDR
От: _agg  
Дата: 20.08.18 10:21
Оценка:
Здравствуйте, _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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.