我正在使用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 回答
在c中使用此片段进行未格式化的十六进制流转储,以前保存到缓冲区
打电话给
改编自epatel的优秀snippet(这个给你一个完整的格式转储) .
我本周和你有完全相同的问题 . 我一直在测试服务器/客户端组合,实质上是发送短信 . 我想我会这样做,然后转向十六进制,只是为了测试水可以这么说 .
但转向二元化绝对是一种痛苦 . 对我来说最有效的是这样的缓冲区 . (仅用于recv(ing),我使用另一个缓冲区将所有recv(ed)组合在一起)
这样做对我的目的非常有效,ff的单个字节会很好地打印出来
相反,只是作为签名字符的缓冲区,这将留给我
因此,在最小化代码方面,不用任何格式就好了 .
诀窍是你还必须以二进制传输 . 你不能期望发送文本,只是在接收端看它的二进制形式 . 它肯定需要一些实验,但我终于能够立即从我的客户端向服务器发送文档 .
我的建议是先用嗅探器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要困难得多,但更有趣:)