简单摘要:
// uint32_t data_length == size of frame 'data_ptr'
enum max_length = sizeof(uint32_t);
memcpy(data_, &data_length, max_length);
auto length = boost::asio::write(*socket_, boost::asio::buffer(data_, max_length), e);
length = boost::asio::write(*socket_, boost::asio::buffer(data_ptr, data_length), e);
// receive
char data_[max_length] = { 0 };
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(_socket, &readSet);
timeval timeout;
timeout.tv_sec = 0; // Zero timeout (poll)
timeout.tv_usec = 0;
auto result = select(_socket, &readSet, nullptr, nullptr, &timeout);
if (result == 0)
continue;
result = recv(_socket, data_, max_length, 0);
if (result == SOCKET_ERROR) {
closesocket(_socket);
_socket = INVALID_SOCKET;
break;
}
uint32_t msg_size(0);
memcpy(&msg_size, data_, max_length);
std::vector<char> vec(msg_size);
result = recv(_socket, &vec[0], msg_size, 0);
while (result < msg_size) {
result += recv(_socket, &vec[result], msg_size - result, 0);
}
但是hololens无法接收完整的数据包,我也尝试使用.net流,同样的结果。它尝试了几次然后在while循环中重新阻止并且不再接收。
任何人,任何想法?这是一个uwp应用程序问题,我无法接受更大的&#39;数据包,或因为它需要太长时间而被杀死?答案 0 :(得分:0)
您有两个主要问题:
首先,您需要检查recv
的返回值是否有错误。如果它返回0或-1,则需要处理它。
其次,您忽略了第一次拨打recv
时收到的所有数据。如果msg_size
应为result
,则将recv
设置为零,减去长度所需的字节数。
我建议编写一个能够准确读取指定字节数的函数,检查错误。首先调用它以接收四个字节并检查它是否返回错误。然后调用它来接收您收到的长度数据所指示的字节数。
较小的问题包括:
如果第一个names = [x["name"] for x in dc]
affiliations = [x["affiliation"] for x in dc]
>>> names
['Smith', 'Doe']
>>> affiliations
['UofHawaii', 'UW']
只返回一个字节怎么办?
如果您的平台存储32位整数的方式与模拟器发送它的方式不同,该怎么办?