【问题标题】:Sending hex over a TCP Socket in C/C++在 C/C++ 中通过 TCP 套接字发送十六进制
【发布时间】:2014-10-11 21:10:25
【问题描述】:

我在使用 TCP 套接字发送十六进制值时遇到了困难。具体来说,我想通过套接字发送一个十六进制值(例如 0x123456),以便 TCP 数据发送,而不是 ASCII 表示,是我想要的值。我目前只能将我想要的值作为 ASCII 字符串发送,感谢任何通过套接字发送十六进制值的帮助。

下面是我写的代码:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstring>
#include <string>
#include <unistd.h>

using namespace std;

int main(int argc, char**argv) {
    int sockfd, n;
    struct sockaddr_in servaddr;
    char sendline[1000];
    char recvline[1000];

    std::string serveraddr = "127.0.0.1";

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr(serveraddr.c_str());
    servaddr.sin_port = htons(1234);

    connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    int number = 0x123456;

    int sendsize;
    sendsize = snprintf(sendline, sizeof(sendline), "%x", number);

    send(sockfd, sendline, sendsize * sizeof(char), 0);

}

【问题讨论】:

  • 想要使用uint8_t 甚至uint32_t 使用网络字节顺序?
  • @jprince14 十六进制值始终是(ascii)字符串中数字的表示形式。因此,您不想发送十六进制值,而是发送值本身。
  • 下面的表达式是真还是假:16==0x10?

标签: c++ c sockets tcp network-programming


【解决方案1】:

您可以send() 任何您想要的数据,它不必是字符串。套接字对原始字节而不是文本进行操作。所以你可以直接发送你的号码:

int number = 0x123456;
send(sockfd, (char*)&number, sizeof(number), 0);

阅读也一样:

int number = 0;
recv(sockfd, (char*)&number, sizeof(number), 0);

话虽如此,多字节数按网络字节顺序传输是惯例(但不是必需的):

int number = htonl(0x123456);
send(sockfd, (char*)&number, sizeof(number), 0);

int number = 0;
recv(sockfd, (char*)&number, sizeof(number), 0);
number = ntohl(number);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2011-12-03
    • 2017-04-27
    相关资源
    最近更新 更多