一般而言,对套接字编程和 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 转换将不起作用..)。有一个更好的方法吗?
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() …