如何在套接字上发送矢量<无符号字符>

how to send on socket a vector<unsigned char>

本文关键字:lt 无符号 gt 字符 套接字      更新时间:2023-10-16

我正在尝试做一个简单的客户端tcp(我已经有一台服务器在工作(。 我定义了 2 个变量:

  1. std::vector<unsigned char> buffer(1000);
  2. std::vector<std::vector<unsigned char>> buff;buffer我使用它来读取无符号字符链,阅读完成后,我将其存储在buff上,然后再次开始阅读。 我已经定义了地址,端口等所有过程,当涉及到发送buffer字符串时,我遇到了问题。 这是我到目前为止尝试过的:

    while(!buff.empty()){
    // Sockets Layer Call: send(
    n = send(sockfd, buff.back(), buff.back.size(), 0);
    std::this_thread::sleep_for(std::chrono::milliseconds(delay)) ;
    buff.pop_back();
    if (n < 0){
    std::cout<<"ERROR writting to socket"<<std::endl;
    exit(1);
    }
    }
    

我尝试添加(char *),也是reinterpret_cast,但嘈杂似乎有效。有什么线索吗?

谢谢

这里有一种方法可以做到这一点:

std::vector<std::vector<unsigned char>> buff;
//...
for (std::vector<std::vector<unsigned char>> i = buff.begin(); 
i != buff.end(); ++i)
{
std::vector<char>::iterator next = i->begin();
while (next != i->end())
{
// if you don't have std::distance, use i->end() - next
n = send(sockfd, &(*next), std::distance(next, i->end()), 0);
if (n < 0)
{
std::cout<<"ERROR writing to socket"<<std::endl;
exit(1);
}
next += n;
if (n != i->end())
{
std::this_thread::yield();
}
}
}

如果您尝试发送向量中的所有向量,那么您或多或少走在正确的轨道上......但是,您的循环永远不会终止,因为您永远不会从buff中弹出最后一个元素

while(!buff.empty()){
// Sockets Layer Call: send(
n = send(sockfd, &(buff.back()[0]), buff.back().size(), 0);
buff.pop_back();   // need to remove what you just sent?
std::this_thread::sleep_for(std::chrono::milliseconds(delay)) ;
if (n < 0){
std::cout<<"ERROR writting to socket"<<std::endl;
exit(1);
}
}