我正在使用C ++ winsock制作服务器 现在我正在尝试调试并查看客户端发送的数据包。
这是我的代码
int iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
(...)
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
cout << "The packet is: " << hex << recvbuf << endl;
但是在客户端已连接显示器的控制台上只有:
The packet is:
没有显示任何内容。我错过了什么?
如果我这样做:
int iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
(...)
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
cout << "The packet size: " << iResult << endl;
//result is "The packet size: 10"
现在我想知道那个数据包是什么。
更新
我试过了:
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
string packet = recvbuf;
cout << "The packet is: " << packet.c_str() << endl;
仍然没有返回任何字符串。只是“数据包是:”
答案 0 :(得分:1)
您在该缓冲区中收到的字节可能是不可打印的,并且可能不是零终止的。例如,使用十六进制格式将它们打印为整数,从0
到iResult - 1
循环。
重要的是你需要打印确切的字节数。如下所示的简单操作(unsigned char
可以避免大于127
的值的符号扩展):
unsigned char buf[BSIZE];
// ... get data of size iResult
for ( int i = 0; i < iResult; i++ ) {
printf( "%02x ", buf[i] );
}
printf( "\n" );