简体   繁体   中英

Target address reversed

I use to code in Python. Now I'm trying C++. When I run the program I see the target address (w/ Wireshark) reverse, even if I use htonl. In Python this same program worked fine. Follow the code. At the bottom I printed the result. I'm using Ubuntu 12.04LTS and g++ (Ubuntu/Linaro 4.6.3).

//UdpClient.cpp
#include <iostream>
#include <string>
#include <sstream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <cstdlib>
#include <arpa/inet.h>
#include <typeinfo>
using namespace std;

int main(int argc, char* argv[])
{
    int s, p, rb,rs;
    int bytesend;
    char buf[1024];
    int len;
    char ent[16];
    char Porta[5];
    unsigned long EndServ;
    struct sockaddr_in UdpServer, UdpClient;
    int UdpServerLen = sizeof(UdpServer);
    //do text
    string msg("The quick brown fox jumps over the lazy dog\n");
    len = msg.copy(buf, msg.size(), 0);

    buf[len] = '\0';
    //do socket
    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s == -1){
        cout << "No socket done\n";
    }
    else {
        cout << "Socket done\n";
    }
    //populate UdpClient struct
    UdpClient.sin_family = AF_INET;
    UdpClient.sin_addr.s_addr = INADDR_ANY;
    UdpClient.sin_port = 0;
    //populate UdpServer struct
    UdpServer.sin_family = AF_INET;
    UdpServer.sin_addr.s_addr = inet_addr(argv[1]);
    //check if addres is correct
    cout << "ServerAddress: " << hex << UdpServer.sin_addr.s_addr << endl;
    UdpServer.sin_port = htons(atoi(argv[2]));
    //bind socket
    rb = bind(s, (struct sockaddr *)&UdpClient, sizeof(UdpClient));
    if (rb == 0){
        cout << "Bind OK!\n";
    }
    else {
        cout << "Bind NOK!!!\n";
        close(s);
        exit(1);
    }
    //send text to Server
    cout << "UdpServSiz: " << sizeof(UdpServer) << endl;
    rs = sendto(s, buf, 1024, 0, (struct sockaddr *)&UdpServer, sizeof(UdpServer));
    if (rs == -1){
        cout << "Message NOT sent!!!\n";
    }
    else {
        cout << "Message SENT!!!\n";
    }
    close(s);
    return 0;
}
/*
  edison@edison-AO532h:~/CmmPGMs$ ./UdpClient 127.0.0.1 6789
  Socket done
  ServerAddress: 100007f (using htonl or not!!)
  Bind OK!
  Message SENT!!!
  edison@edison-AO532h:~/CmmPGMs$ 
*/

Sounds like you're on ARM (Linaro)? In which case the endianness of the processor matches network order, so htonl and ntohl basically do nothing.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM