访问冲突读取位置0xFEEEFEEE(C ++获取PHP套接字)

时间:2014-12-22 07:46:25

标签: php c++ sockets tcp access-violation

我基本上在PHP中得到了一些代码,它只是连接到我的C ++服务器,它正在侦听端口,发送消息,然后关闭套接字。

我正在尝试阅读我发送的内容但事情是......如果我连接太多次C ++服务器最终会发出异常:

  

Server.exe中0x00B6C99B处的未处理异常:0xC0000005:访问冲突读取位置0xFEEEFEEE。

基本上在PHP脚本中的页面加载时,它将套接字(TCP)连接到C ++服务器,发送消息,然后关闭套接字。因此,如果我在完成时按住刷新大约34次(数量不同),我会得到一个例外。

在堆栈中我可以看到一些变量有:“udp = ??? format = ???”,这非常奇怪,因为这些都已经准备就绪,不知道为什么会出现问号。

我从PHP发送的数据也是:

$message = "hello";

在Visual Studio的本地人中,数据结果是:

  

“helloðº\rðº\rðº\rðº\rðº\rðºîþ««««««««ITH”

其他一些变量有“读取字符串字符时出错” 而其他人则: “无法读取内存”

这是我的代码:

double webListen = tcplisten(cst::WEB_PORT, 100, 1);
setnagle(webListen, true);

std::list<double> webUsers;

if (webListen <= 0) {
    cout << "Failed to listen on port " << cst::WEB_PORT <<endl;
}
cout << endl << "Server listening on port " << cst::WEB_PORT << endl;

while(1){
    double WebUser = tcpaccept(webListen, 1);
    if(WebUser > -1){
        cout<< "NEW WEB: " << WebUser <<  endl;
        webUsers.push_back(WebUser);
    }
    std::list<double>::iterator it = webUsers.begin();
    while (it != webUsers.end())
    {
        cout << "SOCK: " << *it << endl;
        //USE A TRY CATCH!!!
        //try{
        double Size = receivemessage(*it, 1024, 2); // Messages coming from web users (whether it be from website or someone using api)
        if(Size == -1){

        }
        else if(Size == 0){
            cout << "WEB GONE: " << *it << endl;
            webUsers.erase(it++);
        }
        else if(Size > 0){
            cout << "SIZE: " << Size << endl;
        }
    }

}

当尝试访问此函数中的UDP变量时发生异常:

    int CSocket::receivemessage(int len, CBuffer*destination)
{
    if(sockid<0)return -1;
    int size = -1;
    char* buff = NULL;

    if(udp)
    {
        size = 8195;
        buff = new char[size];
        size = recvfrom(sockid, buff, size, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize);
    } else
    {
        if(format == 0 && !len)
        {
            unsigned short length;
            if(recv(sockid, (char*)&length, 2, 0) == SOCKET_ERROR)return -1;
            buff = new char[length];
            size = recv(sockid, buff, length, 0);
        } else if(format == 1 && !len)
        {
            size = 65536;
            buff = new char[size];
            size = receivetext(buff, size);
        } else if(format == 2 || len > 0)
        {
            buff = new char[len];
            size = recv(sockid, buff, len, 0);
        }
    }
    if(size > 0)
    {
        destination->clear();
        destination->addBuffer(buff, size);
    }
    if(buff != NULL)delete buff;
    return size;
}

但我的意思是udp和format等变量都已准备就绪...... CSocket对象是否可能已损坏? 我的意思是为什么这只是在刷新PHP页面这么多次之后才发生的? 是什么让它像这样腐败?

0 个答案:

没有答案