我正在使用 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)。
最佳答案
我的建议是首先使用类似 tcpdump 的嗅探器检查线路上发生了什么。或wireshark 。检查发送的字节是否符合 SMPP PDU 。如果没问题,则使用 hexdump(3)
转储通过 SDLNet_TCP_Recv()
读取的缓冲区。并查看是否匹配。
关于代码的一些注释:
- 我没有看到
ip
在任何地方初始化,但我猜您在粘贴代码时只是跳过了该部分。 int bufSize = 1024; char message[bufSize];
仅在 C99 中有效。假设GCC ,始终至少使用-Wall -pedantic
进行编译以捕获所有警告。- 缓冲区位于堆栈上,因此如果将其传递给调用链上的任何函数,结果为 Undefined Behavior 。
我也会尝试用简单的 Berkeley sockets 来重现这个,这并不比 SDL 困难多少,但更有趣:)
关于sockets - 从 C 套接字读取十六进制缓冲区时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466112/