C++ UDP套接字recvfrom中的访问冲突读取位置
我多次尝试从客户端获取数据块(800字节)。在我尝试获取没有前缀长度信息的数据块之前,我开始向服务器发送带有数据块前缀长度信息的数据块 在这两种情况下,我只在服务器端收到一次数据块。通过调试我的服务器端,我发现当我的C++ UDP套接字recvfrom中的访问冲突读取位置,c++,udp,C++,Udp,我多次尝试从客户端获取数据块(800字节)。在我尝试获取没有前缀长度信息的数据块之前,我开始向服务器发送带有数据块前缀长度信息的数据块 在这两种情况下,我只在服务器端收到一次数据块。通过调试我的服务器端,我发现当我的while(1)循环第二次尝试执行时,会出现一个调试错误 First-chance exception at 0x012e2e53 in UDP_server.exe: 0xC0000005: Access violation reading location 0xbd63841d.
while(1)
循环第二次尝试执行时,会出现一个调试错误
First-chance exception at 0x012e2e53 in UDP_server.exe: 0xC0000005: Access violation reading location 0xbd63841d.
Unhandled exception at 0x012e2e53 in UDP_server.exe: 0xC0000005: Access violation reading location 0xbd63841d.
我自己也尝试过很多东西,但仍然无法找出问题所在
//服务器代码
int total_bytes = 0;
int bytes_recv=0;
int count = 0;
uint32_t nlength =0;
std::vector<double> m_vector(nlength/sizeof(double));
int length_received;
while(1)
{
//code to received data length from the client
length_received = recvfrom(Socket,(char*)&nlength, 4, 0,(SOCKADDR*)&ClientAddr,&i);
m_vector.resize(nlength/sizeof(double));
//code to received data length from the client
int bytes_recv = recvfrom(Socket,(char*)&m_vector,nlength,0,(SOCKADDR*)&ClientAddr,&i);
count++;
if((bytes_recv > 0 ))
{
total_bytes = total_bytes+bytes_recv;
std::cout<<"Server: loop counter is"<<count<<std::endl;
std::cout<<"Server: Received bytes are"<<total_bytes<<std::endl;
}else
{
std::cout<<"Data Receiving has finished"<<std::endl;
break;
}
}
int总字节数=0;
int bytes_recv=0;
整数计数=0;
uint32长度=0;
标准::向量m_向量(长度/大小(双));
接收到的整数长度_;
而(1)
{
//从客户端接收数据长度的代码
接收的长度=recvfrom(Socket,(char*)和nlength,4,0,(SOCKADDR*)和ClientAddr,&i);
m_vector.resize(长度/大小(双));
//从客户端接收数据长度的代码
int bytes_recv=recvfrom(Socket,(char*)&m_vector,nlength,0,(SOCKADDR*)&ClientAddr,&i);
计数++;
如果((字节数>0))
{
total_bytes=total_bytes+bytes_recv;
std::cout(char*)&m_vector
不正确。要将向量正确地强制转换到数组,请执行以下操作:
&m_vector[0]
或
或
或者,在C++11中:
m_vector.data()
在Windows上,您可能还需要将表达式强制转换为char*
,因为它使用的是char*
缓冲区,而不是void*
试试这个(char*)&m\u vector[0]
@Nick:感谢您捕捉到错误,现在我使用的是'm\u vector.data()`你的建议也很有效!@Nick POSIXrecvfrom
接受void*
,我想你必须在Windows上将其转换为char*
。
&m_vector.front()
m_vector.data()