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

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

最佳答案

我的建议是首先使用类似 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/

相关文章:

node.js - 跨多个服务器持久化websocket连接对象

c# - WCF 对比 socket

java - Android 多线程

c - 如何处理recv返回

C++ Winsock recv() 缓冲区垃圾

php - WebSocket 服务器端脚本调用

c++ - C C++ - TCP 套接字类 : Receive Problem

c - 如何使用选择处理recv() block

python - python 的 recvfrom() 队列数据包吗?

c++ - WinSock2:使用 recv 和 send 在单独的线程中处理接受的传入连接