【问题标题】:Problem reading hexadecimal buffer from C socket从 C 套接字读取十六进制缓冲区的问题
【发布时间】:2010-03-17 21:41:10
【问题描述】:

我正在使用 SDL_net 套接字 API 创建服务器和客户端。我可以轻松读取字符串缓冲区,但是当我尝试发送十六进制数据时,recv 获取长度,但我似乎无法读取缓冲区内容。

IPaddress ip;
TCPsocket server,client;
int bufSize = 1024;
char message[bufSize];
int len;

server = SDLNet_TCP_Open(&ip);
client = SDLNet_TCP_Accept(server);
len = SDLNet_TCP_Recv(client,message,bufSize);

这是一个sn-p。缓冲区长度“len”已设置(即消息长度),但我无法获取消息缓冲区中的数据内容。一些示例 bind_transmitter PDU 数据由随机客户端发送到该端口的服务器。我无法读取 PDU (SMPP)。

【问题讨论】:

  • 你的意思是二进制数据(相对于数据的字符串表示)?另外,当您说“recv 获取长度”时,您的意思是您先发送数据的长度吗?显示一些代码真的很有帮助。
  • 我的意思是十六进制字节。 “recv”返回读取的适当字节数等于发送数据的大小,但接收到的缓冲区似乎是空的
  • 没有“十六进制”字节。它可以是 binarytext。 “无法获取数据内容”是什么意思?您是否尝试将其打印为字符串?假设它是二进制的,第一个零字节终止字符串。这些可能是基本问题,但根本不清楚您在做什么。
  • 我正在尝试开发的是一个简单的 SMPP 套接字侦听器。客户端发送以十六进制八位字节编码的 PDU 数据,我想在我的末端(即套接字侦听器)接收 PDU 并对其进行解码。

标签: sockets recv


【解决方案1】:

我的建议是首先使用像tcpdumpwireshark 这样的嗅探器检查线路上发生了什么。检查发送的字节是否符合任何SMPPPDU。如果没问题,则使用hexdump(3) 转储使用SDLNet_TCP_Recv() 读取的缓冲区并查看是否匹配。

关于代码的一些注释:

  • 我没有看到 ip 在任何地方初始化,但我猜你在粘贴代码时只是跳过了那部分。
  • int bufSize = 1024; char message[bufSize]; 仅在 C99 中有效。假设GCC,始终至少使用-Wall -pedantic 进行编译以捕获所有警告。
  • 缓冲区在堆栈上,所以如果你将它传递给调用链上的任何函数,结果是Undefined Behavior

我也会尝试用普通的Berkeley sockets 复制它,这并不比 SDL 难,但更有趣 :)

【讨论】:

    【解决方案2】:

    在 c++ 中使用这个 sn-p 来获得一个十六进制流的无格式转储,之前保存到一个缓冲区中

    #include <ctype.h>
    #include <stdio.h>
    void hexdumpunformatted(void *ptr, int buflen) {
      unsigned char *buf = (unsigned char*)ptr;
      int i, j;
      for (i=0; i<buflen; i++) {
        printf("%02x ", buf[i]);
        printf(" ");
      }
    }
    

    调用

    hexadumpunformatted(buffer, bytecount);
    

    改编自 epatel 的优秀 snippet(这个为您提供了完整格式的转储)。

    【讨论】:

      【解决方案3】:

      这周我遇到了和你完全相同的问题。我一直在测试用于发送短信的服务器/客户端组合。我想在转向十六进制之前我会这样做,只是为了试水。

      但是迁移到二进制绝对是一种痛苦。最适合我的是这样的缓冲区。(仅用于 recv(ing),我使用另一个缓冲区将所有 recv(ed) 片段组合在一起)

      unsigned char Buffer[data_size];
      memset(Buffer, 0, data_size);
      

      这样做非常适合我的目的,一个字节的 ff 可以很好地打印出来

      0xff
      

      而不仅仅是一个签名字符的缓冲区,这会让我留下

      0xffffffff
      

      因此,在最小化代码方面,不必修改任何格式是很好的。

      诀窍是您还必须以二进制形式传输。您不能指望发送文本而只在接收端查看它的二进制形式。这肯定需要一些实验,但我终于能够将文档从我的客户端发送到服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-25
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多