我正在使用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)。
答案 0 :(得分:1)
我的建议是首先使用tcpdump或wireshark等嗅探器检查线路上发生了什么。检查发送的字节是否符合任何SMPP PDU。如果没有问题,则使用hexdump(3)
转储使用SDLNet_TCP_Recv()
读取的缓冲区,看看它是否匹配。
关于代码的一些注释:
ip
在任何地方初始化,但我猜你在粘贴代码时跳过了那部分。
int bufSize = 1024; char message[bufSize];
仅在C99中有效。假设GCC,始终至少使用-Wall -pedantic
进行编译以捕获所有警告。
我也会尝试用普通的Berkeley sockets来复制它,这比SDL要困难得多,但更有趣:)
答案 1 :(得分: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的优秀snippet(这个为您提供完整格式化的转储)。
答案 2 :(得分:1)
本周我和你有完全相同的问题。我一直在测试服务器/客户端组合,实质上是发送短信。我想我会这样做,然后再转向十六进制,只是为了测试水域。
但转向二元化绝对是一种痛苦。对我来说最有效的是这样的缓冲区。(仅用于recv(ing),我使用另一个缓冲区将所有recv(ed)组合在一起)
unsigned char Buffer[data_size];
memset(Buffer, 0, data_size);
这样做非常适合我的目的,ff的单个字节可以很好地打印出来
0xff
而不是仅仅是签名字符的缓冲区,这将留下我
0xffffffff
因此,在最小化代码方面,不用任何格式就好了。
诀窍是你还必须以二进制传输。你不能期望发送文本,只是在接收端看它的二进制形式。它肯定需要一些实验,但我终于能够立即从我的客户端向服务器发送文档。