首页 文章

从C套接字读取十六进制缓冲区的问题

提问于
浏览
2

我正在使用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);

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

3 回答

  • 1

    在c中使用此片段进行未格式化的十六进制流转储,以前保存到缓冲区

    #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(这个给你一个完整的格式转储) .

  • 1

    我本周和你有完全相同的问题 . 我一直在测试服务器/客户端组合,实质上是发送短信 . 我想我会这样做,然后转向十六进制,只是为了测试水可以这么说 .

    但转向二元化绝对是一种痛苦 . 对我来说最有效的是这样的缓冲区 . (仅用于recv(ing),我使用另一个缓冲区将所有recv(ed)组合在一起)

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

    这样做对我的目的非常有效,ff的单个字节会很好地打印出来

    0xff
    

    相反,只是作为签名字符的缓冲区,这将留给我

    0xffffffff
    

    因此,在最小化代码方面,不用任何格式就好了 .

    诀窍是你还必须以二进制传输 . 你不能期望发送文本,只是在接收端看它的二进制形式 . 它肯定需要一些实验,但我终于能够立即从我的客户端向服务器发送文档 .

  • 1

    我的建议是先用嗅探器tcpdumpwireshark来检查电线上发生了什么 . 检查发送的字节是否符合SMPP PDU . 如果没有问题,则使用hexdump(3)转储使用 SDLNet_TCP_Recv() 读取的缓冲区,看看它是否匹配 .

    关于代码的一些注意事项:

    • 我没有看到 ip 在任何地方初始化,但我猜你在粘贴代码时只是跳过了那个部分 .

    • int bufSize = 1024; char message[bufSize]; 仅在C99中有效 . 假设GCC,始终至少使用 -Wall -pedantic 进行编译以捕获所有警告 .

    • 缓冲区在堆栈上,因此如果将其传递给调用链上的任何函数,结果为Undefined Behavior .

    我也会尝试用简单的Berkeley sockets来复制它,这比SDL要困难得多,但更有趣:)

相关问题