1

我正在用 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;

仍然没有返回字符串。只是“数据包是:”

4

1 回答 1

1

您在该缓冲区中收到的字节可能是不可打印的,并且可能不是以零结尾的。0将它们打印为整数,例如,以十六进制格式,在从to的循环中iResult - 1

编辑0:

重要的部分是您需要打印确切的字节数。像下面这样简单的事情会做(unsigned char避免值的符号扩展大于 then 127):

unsigned char buf[BSIZE];
// ... get data of size iResult
for ( int i = 0; i < iResult; i++ ) {
    printf( "%02x ", buf[i] );
}
printf( "\n" );
于 2012-11-29T03:55:55.940 回答