2015-08-26 4 views
0

В моей первой программе я нахожу локальный IP-адрес (int iip), и мне хотелось бы отправить этот IP-адрес, а также порт (int port = 1100) в структуры (Ins c). Затем я хотел бы, чтобы вторая программа получила эту структуру и выберет ip-адрес и порт для использования в tcp-соединении позже.Ошибка структуры и int char * conversion

n_addr inaddr; 
inaddr.s_addr = htonl(iip); 

    int udp_socket_info; 
    struct sockaddr_in udp_server; 

    udp_socket_info = socket(AF_INET, SOCK_DGRAM, 0); 
    if (udp_socket_info == -1) { 
    puts("Could not create udp socket"); 
    } 
    puts("Udp socket created"); 

    udp_server.sin_addr.s_addr = inet_addr("225.0.0.37"); 
    udp_server.sin_port = htons(1100); 
    udp_server.sin_family = AF_INET; 

    int port = 1100; 


Ins c(iip, port);   
sendto(udp_socket_info, &c, sizeof(c), 0, (struct sockaddr *)&udp_server, sizeof(udp_server)); 
puts("STRUCT Message Sent"); 

В одной программе я получаю следующую структуру:

Ins c; 
if (recvfrom(udp_socket_info, &c, sizeof(c), 0, &addr, &fromlen) < 0) { 
perror("Recvfrom error:"); 
} 
puts("STRUCT Message Received"); 

tcp_ip = c.address; 
tcp_port = c.port; 

В заголовочном файле MonReqServer.hh Заявляю TCP_IP и TCP_PORT, как символ *, потому что это то, что мне нужно использовать для настройки tcp socket.

private: 
    char* tcp_ip; 
    char* tcp_port; 

И следующее заголовок для Ins.hh

namespace Pds { 
class Ins 
    { 
    public: 
    Ins(); 
    enum Option {DoNotInitialize}; 
    explicit Ins(Option); 
    explicit Ins(unsigned short port); 
    explicit Ins(int address); 
    Ins(int address, unsigned short port); 
    Ins(const Ins& ins, unsigned short port); 
    explicit Ins(const sockaddr_in& sa); 

    int     address()  const; 
    void     address(int address); 
    unsigned short  portId()  const; 

    int operator==(const Ins& that) const; 

    protected: 
    int  _address; 
    unsigned _port; 
    }; 
} 

Это мои ошибки:

MonReqServer.cc: In member function 'virtual void Pds::MonReqServer::routine()': 
MonReqServer.cc:79: error: cannot resolve overloaded function 'address' based on conversion to type 'char*' 
MonReqServer.cc:80: error: 'class Pds::Ins' has no member named 'port' 

Мой вопрос то в том, как преобразовать мой адрес в полукокса * как только я получу его? В частности, какая команда переключается с int на char * и как я могу ее внедрить? Кроме того, почему он говорит, что у Ins нет имени имени порта? Я думал, что IP-адрес и порт - это то, что Ins должен предпринять? Пожалуйста, дайте мне знать, если мои вопросы неясны или вам нужна какая-либо другая информация? Спасибо!

+0

Посмотрите станд :: stringstream – cppguy

ответ

0

Прежде всего, ваши члены называются _port и _address, а не порт и адрес. Они не являются общедоступными, поэтому вы можете получить их со своими функциями portId() и address() Во-вторых, чтобы преобразовать число в строку c, вы можете использовать функции sprintf или itoa.

+0

Когда я пытаюсь что-то вроде itoa (c.address(), TCP_IP, 10); он говорит, что «itoa» не был объявлен в этой области, хотя у меня есть stdio.h и stdlib.h, включенные ... что мне сейчас не хватает? – user2616248

+0

itoa не определен в ANSI-C и не является частью C++, но поддерживается некоторыми компиляторами. Попробуйте sprintf вместо – EvgeniyZh

+1

sprintf (tcp_ip, "% i", c.address()); Это верно? – user2616248

1

Во-первых, опасность опасность!

char* tcp_ip; 
char* tcp_port; 

Эти указатели должны указывать на что-то, и это должно быть что-то с определенной постоянством. Я не вижу, чтобы это могло произойти, поэтому вы должны определить хранилище здесь.

char tcp_ip[SizeOfBiggestIPAddressPossible]; 
char tcp_port[SizeOfBiggestPortNumberPossible]; 

где

#define  SizeOfBiggestIPAddressPossible (4+1+4+1+4+1+4+1+4+1+4+1+4+1+4+1) 
#define  SizeOfBiggestPortNumberPossible (5+1) 

Но это просто глупо. Поскольку OP помечен для C++, давайте просто использовать пару строк и избавить нас от переполнения буфера и других странностей.

std::string tcp_ip; 
std::string tcp_port; 

Далее, изменение числа в строке здесь почти бесполезно. Количество нанизывать работает для номера порта ...

tcp_port = std::to_string(c.portId()); 

Или, если не хватает C++ 11 поддержки создать следующую функцию

template <class TYPE> 
std::string toString(TYPE val) 
{ 
    std::stringstream temp; 
    temp << val; 
    return temp.str(); 
} 

и называют его

tcp_port = toString(c.portId()); 

но конвертировать номер к IP-адресу - это еще один зверь целиком. IP-адрес - это форматированная строка с точками или двоеточиями, смешанными с числами. Если есть хороший способ C++, я этого не знаю.

В * nux land, вы звоните inet_ntop.

Предполагая ipv4 (не компилируется и тестируется, но должна быть близка):

char temp[INET_ADDRSTRLEN]; 
struct sockaddr_in sockAddr; 
sockAddr.sin_addr.S_un.S_addr = htonl(c.address()); 
if (inet_ntop(AF_INET, &addr, temp, INET_ADDRSTRLEN)!= null) 
{ 
    tcp_ip = temp; 
} 
else 
{ 
    std::cerr << "Bad address" << std::endl; 
    // handle error 
} 

В Windows вы можете вызвать same function или целый набор Windows, конкретных альтернатив.

Теперь у вас есть две приятные, вежливые строки на С ++, которые делают все управление тяжелым грузом для вас. Чтобы получить строки стиля C (const char *), используйте метод c_str.

const char * addrp = c.address().c_str(); 

Если вам нужен не const char *, то кто-то заслуживает пощечины.

редактировать: Пропущенный на очевидном IP4 только взломать

Это поможет вам адрес в виде строки, но он не поддерживает будущее. Или прошлое как IPv6 было вокруг для чего, 35 лет?

uint32_t temp = c.address(); 
std::stringstream addr; 
addr << ((temp >> 24) & 0xFF) << '.' << 
     ((temp >> 16) & 0xFF) << '.' << 
     ((temp >> 8) & 0xFF) << '.' << 
     ((temp >> 0) & 0xFF); 
tcp_ip = addr.str(); 
+0

Кажется, я не могу использовать std :: to_string, потому что получаю эту ошибку ..... ошибка: 'to_string' не является членом 'std'. Почему это? – user2616248

+0

Вилка. Коэффициенты вашего компилятора не поддерживают C++ 11 или у вас нет правильных флагов, установленных для его включения. Гимми минутку, чтобы обновить ответ. – user4581301