我曾经用Python编写代码。现在我正在尝试C ++。运行程序时,即使使用htonl,我也会看到目标地址(带有Wireshark)反向。在Python中,该程序运行良好。
遵循代码。在底部,我打印了结果。
我正在使用Ubuntu 12.04LTS和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$
*/

最佳答案

听起来像您在使用ARM(Linaro)?在这种情况下,处理器的字节序与网络顺序匹配,因此htonl和ntohl基本上不执行任何操作。

08-18 15:11