C++ 服务器不显示数据包

标签 c++ sockets winsock

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

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

最佳答案

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

编辑0:

重要的部分是您需要打印准确的字节数。像下面这样简单的事情(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" );

关于C++ 服务器不显示数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618486/

相关文章:

java - JNLP 对 jar 文件请求两次权限

c++ - 用户模式下可用的最低级别的 WinSock API 是什么? (用于 API 注入(inject)蹦床。)

c++ - C++ 库中的快速梯度下降实现?

c++ - 我可以在 STL 容器中使用 MFC 对象吗?

c++ - 如何覆盖自定义 Firemonkey 控件的单击事件

c++ - 如何计算多张图片的平均值

java - 无法将数据输入到数据输出流

objective-c - 在 iOS 中针对不同的应用程序状态使用套接字的正确方法是什么?

c++ - 我的静态库中不同头文件重复使用的头文件

https - 您如何使用阻塞套接字进行超时持久/保持事件 SSL 连接?