【问题标题】:determining the size of the buffer at run time? (socket programming)在运行时确定缓冲区的大小? (套接字编程)
【发布时间】:2014-11-18 20:55:30
【问题描述】:

为了确定在 UDP 数据包中接收到的消息类型,需要查看从“recvfrom”接收到的特定缓冲区元素 [i],以便识别预期消息的类型。首先,我使用堆栈中的缓冲区来填充缓冲区(recvfrom),我知道我应该接收的消息的最大大小。

所以说我的数组缓冲区是 300 字节,我收到一个不同大小的数据包(例如 30、80、210 字节等)....我怎么知道收到的大小(这是因为很少有其他我测试的标准以确定消息的性质)

知道大小将使我能够对对象使用 memcpy。

我正在考虑 strlen(udp packet) 因为它是在运行时而不是编译时确定的。 问题是如果数据包的其余部分充满垃圾怎么办......

我很感激

【问题讨论】:

    标签: c++ c sockets


    【解决方案1】:

    recv(2),用于接收UDP包,返回接收到的字节数。

    【讨论】:

    • 是的,你是对的,它忘记了返回字节数,recvfrom 也返回字节数。非常感谢
    • 您也可以在每次调用 recvfrom() 之前使用 memset() 将整个缓冲区设置为 ;\0' 并且要接收的最大字节数是 recvfrom() 的一部分,因此缓冲区没有超支。
    • 注意:UDP 数据包只允许单次读取,因此缓冲区大小必须 >= 最大 udp 数据包大小。最好至少大 1 个字节。 UDP 数据包可能包含空字节 (0x00),因此使用字符串函数将不可靠/容易出错
    • 感谢您的回复,但我的问题还没有解决,问题在于 sizeof(pack_buff)。例如,如果您声明 char* pack_buff[100]。当我打印它的大小时,它给了我 800。其他人说你无法确定指针指向的数组的大小。所以即使我像这样使用 memset((char*)&pack_buff,0,sizeof(pack_buff)) ,我仍然需要知道如何确定 puck_buff 的大小。我希望它只打印 100 个字节(char = 1 字节)。
    • 如果 sizeof(pack_buff) 被声明为 : char* pack_buff[100]; 为什么会给出 800;
    猜你喜欢
    • 2012-10-07
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多