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

时间:2010-03-17 21:41:10

标签: sockets recv

我正在使用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 个答案:

答案 0 :(得分: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要困难得多,但更有趣:)

答案 1 :(得分: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(这个为您提供完整格式化的转储)。

答案 2 :(得分:1)

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

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

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

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

0xff

而不是仅仅是签名字符的缓冲区,这将留下我

0xffffffff

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

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