- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于通过 UDP 进行的一些数据传输,我使用了来自 boost 的 async_receive_from
函数。我的接收函数是
udp::socket socket_;
udp::endpoint remote_endpoint_;
boost::array<char, 200> recv_buffer_;
void start_receive()
{
std::fill(recv_buffer_.begin(), recv_buffer_.end(), '\0');
socket_.async_receive_from(boost::asio::buffer(recv_buffer_), remote_endpoint_, boost::bind(&udp_server_ping::handle_receive, this, boost::asio::placeholders::error));
}
void handle_receive(const boost::system::error_code& error)
{
if (!error || error == boost::asio::error::message_size)
{
for(int i = 0; i < 200; i++)
std::cout << recv_buffer_.c_array()[i];
std::cout << '\n';
for(auto it = boost::begin(recv_buffer_); it != boost::end(recv_buffer_); ++it)
std::cout << *it;
std::cout << '\n';
switch(recv_buffer_.c_array()[0])
{
case '#':
{
got_ping = true;
std::cout << "Gotcha!\n";
break;
}
case '$':
{
std::vector<char> char_buf(boost::begin(recv_buffer_), boost::end(recv_buffer_));
std::stringstream ss(std::string(char_buf.begin(), char_buf.end()));
std::vector<std::string> ip_list;
std::string ip;
std::cout << "Char_buf is: ";
for(auto it = boost::begin(recv_buffer_); it != boost::end(recv_buffer_); ++it)
std::cout << *it;
std::cout << "\nStringstream is: " << ss << '\n';
while(std::getline(ss, ip, '$'))
{
ip_list.push_back(ip);
};
ip_adr_ccd = ip_list[0];
ip_adr_daisy = ip_list[1];
std::cout << "ip_adr_ccd is: " << ip_list[1] << " and ip_adr_daisy is: " << ip_list[2] << '\n';
ip_adr_display.push_back(ip_list[3]);
break;
}
default:
break;
start_receive();
}
而我的传输功能是
DLL void transmit_ip(void)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
struct sockaddr_in sa;
struct hostent *hp;
SOCKET s;
std::string ip_adr;
if(Use == 'T')
ip_adr = ip_adr_ccd;
else
{
if(Use == 'S')
ip_adr = ip_adr_daisy;
else
ip_adr = ip_adr_display[0];
};
//Debug
//std::cout << "Pinging ip: " << ip_adr << '\n';
hp = gethostbyname(ip_adr.c_str());
if (hp == NULL) /* we don't know who this host is */
return;
memset(&sa,0,sizeof(sa));
memcpy((char *)&sa.sin_addr, hp->h_addr, hp->h_length); /* set address */
sa.sin_family = hp->h_addrtype;
sa.sin_port = htons((u_short)PORTNUM_UDP_OUT);
s = socket(hp->h_addrtype, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
return;
std::string tx_str = '$' + ip_adr_ccd + '$' + ip_adr_daisy + '$' + retLocalIP() + '$';
//char str[] = "$127.0.0.1$128.0.0.1$129.0.0.1$";
std::cout << "tx_str is: " << tx_str << '\n';
char * buffer = new char[tx_str.length() + 1];
std::strcpy(buffer, tx_str.c_str());
int ret;
ret = sendto( s, buffer, sizeof(buffer), 0, (struct sockaddr *)&sa, sizeof(sa));
delete buffer;
}
当我使用 str[] 进行传输时,一切都很好,但是当我要传输我的 tx_str 时,接收器立即崩溃并且只显示 $192 作为接收数据。造成缓冲区溢出我做错了什么?
最佳答案
当 buffer
是一个 char*
时,sizeof(buffer)
返回指针的大小,而不是指向的长度字符串。似乎编译它的系统使用 4 个字节作为指针,因此只传输 4 个字符。收到 4 个字节后,handle_receive()
在尝试访问 ip_list
中的无效索引时调用未定义的行为,因为代码假定始终从接收消息中提取 3 个字符串.
要解决此问题,请显式向 sendto()
提供缓冲区大小,而不是使用 sizeof()
。变化:
ret = sendto( s, buffer, sizeof(buffer), 0, ...)
到:
ret = sendto( s, buffer, tx_str.length() + 1, 0, ...)
可能还值得考虑检查输入并验证 ip_list
是在索引到它之前的预期大小。
char[]
和 char*
是不同的类型。对于 char*
,sizeof()
将返回给定系统上指针的大小,而不是指针指向的字符串的长度。另一方面,对于 char[]
,sizeof()
将返回数组的大小。例如:
#include <iostream>
int main()
{
char str[] = "123456789ABCDEF";
char* buffer = new char[100];
std::cout << "char[] size = " << sizeof(str) << "\n"
"char* size = " << sizeof(buffer) << std::endl;
}
结果:
char[] size = 16
char* size = 8
关于c++ - async_receive_from 没有收到所有东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22690071/
对于通过 UDP 进行的一些数据传输,我使用了来自 boost 的 async_receive_from 函数。我的接收函数是 udp::socket socket_;
在我发现的所有样本中,我看不到任何缓冲。这是否意味着在处理程序中我总是收到完整的消息?没有分块。 我在文档中找不到任何答案。 Is boost::asio::ip::udp::socket::asyn
下面从真实代码库简化而来的 MVCE 显示了同样的问题。 服务器连续发送 5 个 UDP 帧的“突发”,其中填充了 150 个字节的值 0xA5,中间有很小的延迟或没有延迟。暂停 1 秒。 客户端使用
我在 udp_server 类中创建了异步函数 start_receive() 和 start_send()。但是通过代码不会停止并等待“async_receive_from”行。这是我的代码; cl
我正在使用 async_receive_from 读取多播输入。所以我的想法是,当我检测到间隙时,我将通知另一个帮助线程请求/获取间隙填充消息。虽然这是在工作中,但主线程将继续接收和排队任何传入的消息
在下面的代码中,asynch_receive_from 的行为是同步的。在收到数据之前它不会返回。查看最后的日志表明了这一点。这可能不是那个一开始很明显,因为有相当高的数据传入率。但是当没有数据时,只
我正在使用 boost::asio 来捕获 udp 端口上的数据包。我只是新来的。如何使 async_receive_from 复制数据以仅缓冲具有指定源 ip 的数据包? 最佳答案 根据您所说的
我有一个 boost 套接字,我在上面定义了一个异步接收: void recv() { boost_socket->async_receive_from( boost::asio::buf
class UDP_Receiver { public: udp_receiver((boost::asio::io_service& io_service) : idle_work_
我尝试使用 async_receive_from 方法来获取数据。但是当我开始时,程序不会等待超时或正在读取某些内容。我知道数据正在端口(wireshark)上传入。这可能是什么原因。我尝试使用来自
我有一个设置,多个对等方每 200 毫秒 (5fps) 广播一次 udp 数据包(包含图像)。 虽然接收本地流作为外部流在 Windows 下工作正常,但相同的代码(除了 Windows XP 中的
我正在尝试使用 Boost 库创建一个简单的异步接收器。我遵循了示例和书籍,这就是我到目前为止能够做到的: class networkUDPClient { public: utilityTr
基本上: void start_receive() { socket_.async_receive_from( boost::asio::buffer(recv_buf
我正在尝试使用 3 次握手建立异步连接。在代码的底部有一个 main 方法,它接受一个参数来确定它是充当客户端还是服务器。 如果它充当服务器,它会创建一个套接字并等待它接收到数据,然后调用回调函数 m
Boost asio 专门允许多个线程调用 io_service 上的 run() 方法。这似乎是创建多线程 UDP 服务器的好方法。但是,我遇到了一个问题,我正在努力寻找答案。 查看典型的 asyn
我有一个相当大的应用程序,可以在 Linux 上正常运行。我最近使用 VC2012 和 boost asio 1.52 在 Windows 7 上编译它并遇到了一个奇怪的问题: async_recei
我正在使用 boost::asio 创建服务器应用程序,特别是 UDP API。现在我从一个池中启动多个线程,使用 async_receive_from 监听单独的缓冲区。这在我主要开发的 Ubunt
我想创建一个自治线程,专门用于使用 boost 库 (asio) 从 UDP 套接字接收数据。这个线程应该是一个无限循环,由从 UDP 套接字接收到的一些数据触发。在我的应用程序中,我需要使用异步接收
int main() { boost::asio::io_service io_service; Worker ob1(&io_service); ob1.AsyncRead(); i
我已将 Boost 白天客户端教程中的 UDP 客户端代码修改为以下内容: class UDPClient { public: udp::socket* socket; udp::en
我是一名优秀的程序员,十分优秀!