小编not*_*lso的帖子

使用 recv() 确定数据包大小的最佳方法是什么?

一般而言,对套接字编程和 C 非常陌生。我正在尝试编写一个基本程序来在两台机器之间发送和接收数据。我知道这recv不会一次获得所有数据——您基本上必须循环它,直到它读取了整个消息。

代替只是在两台机器上设置限制,我Message在客户端创建了一个简单的结构:

struct Message {
    size_t length;
    char contents[1024 - sizeof(size_t)];
} message; 
message.length = sizeof(struct Message);
message.contents = information_i_want_to_send;
Run Code Online (Sandbox Code Playgroud)

当它到达服务器时,我recv读入了一个缓冲区:(received = recv(ioSock, &buffer, 1024, 0)巧合的是它与我的 Message 结构的大小相同——但假设它不是......)。

然后我Message.length像这样从缓冲区中提取:

size_t messagelength;
messagelength = *((size_t *) &buffer);
Run Code Online (Sandbox Code Playgroud)

然后我循环recv到缓冲区 while received < messagelength。这有效,但我不禁觉得它真的很丑,而且感觉很糟糕。(特别是如果第一次recv调用读取小于sizeof(size_t)或机器是不同的位架构,在这种情况下 size_t 转换将不起作用..)。有一个更好的方法吗?

c sockets send recv

1
推荐指数
1
解决办法
753
查看次数

std::distance 没有给出预期的输出

std::distance 在 for 循环中返回相同的值,尽管其中一个参数在每个循环中都发生了变化。

#include <vector>
#include <iostream>

using namespace std;

int main() {
    vector<int> q{1, 2, 3, 4, 5};
    for (auto i = q.rbegin(); i != q.rend(); i++) {
        static int index_dif = distance(i, q.rend());
        cout << *i << ": " << index_dif << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

5: 5
4: 5
3: 5
2: 5
1: 5
Run Code Online (Sandbox Code Playgroud)

尽管i每个循环都会增加,所以我希望q.rend()它之间的距离随着循环的进行而缩小,如下所示:

5: 5
4: 4
3: 3
2: 2
1: 1
Run Code Online (Sandbox Code Playgroud)

相反,它似乎给人之间的距离q.rbegin()q.rend() …

c++ reverse for-loop distance stdvector

0
推荐指数
1
解决办法
53
查看次数

标签 统计

c ×1

c++ ×1

distance ×1

for-loop ×1

recv ×1

reverse ×1

send ×1

sockets ×1

stdvector ×1