我写了一个myTcpSocket类:实现连接服务器,数据的发送接收!这个类的代码实现应该没有什么问题!
可是当我调用时就发生死机现象!!代码如下:
......
myTcpSocket myClient(PORTNUM); 
myClient.connectToServer(serverIPAddress,ADDRESS);
AcceptData(&myClient);
void CUserLogDlg::AcceptData(myTcpSocket* vmyClient)
{
   mySemaphore coutSemaphore(string(""),1);
   int recvBytes=0;
   while (stateFlag==0) {
       string messageFromServer = "";
       recvBytes = vmyClient->recieveMessage(messageFromServer);  
       if ( recvBytes == -99 ) break;
       coutSemaphore.lock();
       recvValue=messageFromServer);
       coutSemaphore.unlock();
       stateFlag=1;
  }
}能成功连接到服务器!可是当执行“ recvBytes = vmyClient->recieveMessage(messageFromServer);  这句是,系统就无响应,死机!请教为什么啊!各位帮帮忙!很急!!!谢谢了!!!

解决方案 »

  1.   

    为什么要用Semaphore?你用Semaphore的原因是什么,要实现(多个线程同时读?)临界区CriticalSection,不进入内核,比Semaphore好多了,不过只能(一个线程写,一个线程读)
      

  2.   

    请问你用的是SDK中的API,还是用的MFC中类?
    如果你用的是MFC中的CSocket类来做的话,按照你的要求去做,是肯定会死掉的,因为CSocket中的Receive是阻塞的,而从你的代码中没有看到你设置的超时时间.
    如果你用的是MFC中的CAnsyncSocket或SDK的API,那么请检查你的代码,
    你的哪个循环好象有问题,不能退出,因为
    recvBytes = vmyClient->recieveMessage(messageFromServer);  这句
    如果接受到数据的话是不会等于-99的,如果没有接受到数据的话,又是异步接受的话(使用SDK API或CAnsyncSocket),返回的不是-99,所以你的循环始终退不出去.
      

  3.   

    是要多个线程同时读数据!!
    我用的是#include <winsock2.h>
    我在几个Dialog创建的类中都要同时读取数据:能不能都通过调用下面的代码实现与服务器的连接创建Socket,接收数据!!
    myTcpSocket myClient(PORTNUM); 
    myClient.connectToServer(serverIPAddress,ADDRESS);
      

  4.   

    shenyi0106(紫色清风) :退出循环是通过变量 stateFlag控制的!!
      

  5.   

    原来你说的“死机现象”就是窗口不响应 WM_PAINT了!!这种现象不能称为“死机”,只能说是 在某个消息处理函数中,调用了 阻塞函数(如blocking 下的recv),从而阻塞了窗口的消息循环,导致窗口不能处理自己的重绘消息,看上去像窗口死了一样。如果你用的是sock blocking mode,最好创建一个新线程来处理。
    如果你用的是WSAAsyncSelect,请你创建一个新窗口来处理网络消息,不要再界面窗口上来收发网络信息
    另外你说的现象也可能是 Semaphore 死锁引起的
      

  6.   

    不是窗口不响应!
    就是当程序执行到:recvBytes = vmyClient->recieveMessage(messageFromServer);  这句时,下面的语句都不执行了,程序还处于运行状态,系统就死了!
      

  7.   

    是阻塞在recieveMessage这个调用上边了吧,把里边的代码发上来
      

  8.   

    下面是类myTcpSocket实现接收数据的代码!大家帮忙看看有没有错误?万分谢谢!!!
    #ifdef WINDOWS_XP
    int myTcpSocket::XPrecieveMessage(string& message)
    {
        int received = 0;                
        int msgSize = MAX_RECV_LEN;       
        int numBytes = 0;                 
        int totalRecvNum = 0;
        bool headerFinished = false;
        char charMsg[MAX_RECV_LEN+1];
        char msgLength[MSG_HEADER_LEN+1];
        memset(charMsg,0,sizeof(charMsg));
        memset(msgLength,0,sizeof(msgLength));
    try
    {
    while ( received < msgSize )
    {
    numBytes = recv(socketId,charMsg+received,1,0);
    if (numBytes == -1)
    {
    int errorCode = 0;
    string errorMsg = "error calling recv():\n";
    detectErrorRecv(&errorCode,errorMsg);
    myException socketRecvException(errorCode,errorMsg);
    throw socketRecvException;
    } if ( !headerFinished )
    {
    msgLength[received] = *(charMsg+received);
    received ++; if ( received == MSG_HEADER_LEN )
    {
    headerFinished = true;
    received = 0;
    memset(charMsg,0,sizeof(charMsg));
    msgSize = atoi(msgLength);
    }
    }
    else 
    received ++;
    }
    }
    catch(myException& excp)
    {
    if ( excp.getErrCode() == WSAECONNRESET )
    {
    return -99;
    }
    excp.response();
    exit(1);
    } message.append(string(charMsg));
        return msgSize;
    }#endifint myTcpSocket::recieveMessage(string& message)
    {
    int numBytes;  // The number of bytes recieved #ifdef WINDOWS_XP
    return XPrecieveMessage(message);
    #endif // retrieve the length of the message received char msgLength[MSG_HEADER_LEN+1];
    memset(msgLength,0,sizeof(msgLength));
    try
    {
    numBytes = recv(socketId,msgLength,MSG_HEADER_LEN,0);
            if (numBytes == -1)
            {
    myException unixSocketRecvException(0,"unix: error calling recv()");
    throw unixSocketRecvException;
    }
    }
        catch(myException& excp)
    {
    excp.response();
    exit(1);
    } // receive the real message
    try
    {
    numBytes = recv(socketId,(char*)(message.c_str()),atoi(msgLength),0);
            if (numBytes == -1)
            {
    myException unixSocketRecvException(0,"unix: error calling recv()");
    throw unixSocketRecvException;
    }
    }
        catch(myException& excp)
    {
    excp.response();
    exit(1);
    }    return numBytes;
    }