0

我习惯用 Python 编写代码。现在我正在尝试 C++。当我运行程序时,我看到目标地址(w/Wireshark)反转,即使我使用 htonl。在 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$ 
*/
4

1 回答 1

1

听起来你在 ARM (Linaro) 上?在这种情况下,处理器的字节序匹配网络顺序,所以 htonl 和 ntohl 基本上什么都不做。

于 2012-12-26T15:22:56.007 回答