Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ UDP套接字recvfrom中的访问冲突读取位置_C++_Udp - Fatal编程技术网

C++ UDP套接字recvfrom中的访问冲突读取位置

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.

我多次尝试从客户端获取数据块(800字节)。在我尝试获取没有前缀长度信息的数据块之前,我开始向服务器发送带有数据块前缀长度信息的数据块

在这两种情况下,我只在服务器端收到一次数据块。通过调试我的服务器端,我发现当我的
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 POSIX
recvfrom
接受
void*
,我想你必须在Windows上将其转换为
char*
&m_vector.front()
m_vector.data()