Sockets 从C套接字读取十六进制缓冲区时出现问题

Sockets 从C套接字读取十六进制缓冲区时出现问题,sockets,recv,Sockets,Recv,我正在使用SDL_net sockets 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)

我正在使用SDL_net sockets 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”已设置(即消息长度),但我无法访问消息缓冲区中的数据内容。一些样本绑定单元发送器PDU数据由随机客户端发送到该端口的服务器。我无法读取PDU(SMPP)。

我的建议是首先使用类似or的嗅探器检查线路上发生了什么。检查发送的字节是否符合任何要求。如果没有问题,则使用
SDLNet\u TCP\u Recv()
转储读取的缓冲区,并查看其是否匹配

关于代码的一些注释:

  • 我看不到任何地方初始化了
    ip
    ,但我猜您只是在粘贴代码时跳过了这一部分。
  • int bufSize=1024;字符消息[bufSize]仅在中有效。假设,始终至少使用
    -Wall-pedantic
    编译以捕获所有警告。
  • 缓冲区位于堆栈上,因此,如果将其传递给调用链上的任何函数,则结果是。

我也尝试用简单的方法来复制这个,这比SDL要难很多,但是更有趣:)

< P>在C++中使用这个片段,用于未被格式化的HEX流的转储,以前保存到缓冲区

#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(" ");
  }
}

改编自epatel的优秀作品(这本书提供了完整的格式转储)。

本周我和你有着完全相同的问题。我一直在测试一个服务器/客户端组合,它基本上可以发送文本消息。我想我会这样做,然后再移动到十六进制,只是为了测试水可以这么说

但转用二进制软件无疑是一种痛苦。对我来说最有效的是这样一个缓冲区(仅用于recv(ing),我使用另一个缓冲区将所有recv(ed)片段组合在一起)

这样做对我来说效果很好,ff的一个字节就可以很好地打印出来

0xff
而不是仅仅作为签名字符的缓冲区,这会给我留下

0xffffffff
因此,在最小化代码方面,不必欺骗任何格式是很好的


诀窍是你也必须用二进制传输。您不能期望发送文本,而只是查看接收端的二进制形式。这当然需要一些实验,但我现在终于能够将一个文档从我的客户机发送到服务器

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