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)。

4

3 回答 3

1

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

关于代码的一些注释:

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

我也会尝试使用普通的Berkeley 套接字来复制它,这并不比 SDL 困难得多,但更有趣:)

于 2010-03-20T00:58:32.647 回答
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 的优秀片段(这个片段为您提供完整格式的转储)。

于 2012-09-07T15:57:00.343 回答
1

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

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

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

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

0xff

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

0xffffffff

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

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

于 2013-11-22T23:17:28.083 回答