客户端程序由100个线程,每个线程分别于服务器连接通信,不停地send与serv
服务器定义了100个线程,分别对应接收客户端sock,线程里sevr,send循环
现在的问题是弹出取指溢出错误,
感觉像是服务器超过了100个线程,
MessageBox(NULL,"access","notify",0);
有时候弹出了access对话框。有点长,不好意思
请大家帮我看一下
for (i=0;i<THREAD_NUM;i++)
{
iAddrSize = sizeof(client);
sClient[i] = accept(sListen, (struct sockaddr *)&client,
                         &iAddrSize); 
if (sClient[i] == INVALID_SOCKET)
{        
     printf("accept() failed: %d\n", WSAGetLastError());
      continue;
}
if (i>100)
{
MessageBox(NULL,"access","notify",0);
}
printf("Accepted client: %s:%l\n", 
         inet_ntoa(client.sin_addr), ntohs(client.sin_port));

hThread[i] = CreateThread(NULL, 0, ClientThread, 
                       (LPVOID)sClient[i], 0, &dwThreadId[i]);
if (hThread[i] == NULL)
{
       printf("CreateThread() failed: %d\n", GetLastError());
        continue;
         }     
}
while(1);

解决方案 »

  1.   

    这个问题你要Debug调试,打开call stack看看运行到哪个函数抛出异常啊
      

  2.   

    不用这么多 accept, 一个线程accept 就够了,accept 每个SOCKET开一新线程, 
      

  3.   

    你这代码太逗了
    THREAD_NUM 是多少? 100,如果是100的话,你在循环里面加那个if(i> 100) 是不信任for的意思么如果THREAD_NUM超过100,那就正常了。
    ===========================================
    现在的问题是弹出取指溢出错误, 上代码。
      

  4.   

    实际上服务器的THREAD_NUM 定义了120,客户端是100
    事件函数
    info.sheet0 = &m_disDlg.m_grid;
    info.pserver=&server;
    info.message=m_message;
    b_flag=true;

    for ( j=0;j<THREAD_NUM;j++)
    {
    m_count=j;
    info.count = m_count+1;
    hthread[j]=AfxBeginThread(ThreadFunc,(LPVOID)&info);

    Sleep(20);
    }

    处理线程:
    UINT ThreadFunc(LPVOID pinfo)
    {
    threadinfo* m_pinfo=(threadinfo*)pinfo;
    CMSFlexGrid* p_sheet=m_pinfo->sheet0;
    struct sockaddr_in* m_pserver=m_pinfo->pserver;
    CString m_message=m_pinfo->message;
    int m_count=m_pinfo->count;
    char buf[BUFFER_SIZE];
    CString m_str;
    int ret;
    int loop=0; m_str.Format("%d",m_count);
    p_sheet->SetTextMatrix(m_count,0,m_str); SOCKET client;
    client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (client==INVALID_SOCKET)
    {

    p_sheet->SetTextMatrix(m_count,1,"failed");

    }
    p_sheet->SetTextMatrix(m_count,1,"succeed"); if(connect(client,(struct sockaddr *)m_pserver,sizeof(*m_pserver))==SOCKET_ERROR)
    {
    m_str.Format("%d",WSAGetLastError());
    p_sheet->SetTextMatrix(m_count,2,m_str);

    }
    p_sheet->SetTextMatrix(m_count,2,"succeed");
    while (b_flag)
    {
    loop++;
    if (send(client,m_message,strlen(m_message),0)==SOCKET_ERROR)
    {
    m_str.Format("%d-%d",loop,WSAGetLastError());
    p_sheet->SetTextMatrix(m_count,3,m_str);
    break;
    }
    m_str.Format("succed %d",loop);
    p_sheet->SetTextMatrix(m_count,3,m_str);

    if ((ret=recv(client,buf,BUFFER_SIZE,0))==SOCKET_ERROR)
    {
    m_str.Format("%d-%d",loop,WSAGetLastError());
    p_sheet->SetTextMatrix(m_count,4,m_str);
    break;
    }
    buf[ret]='\0';
    CString str0,str1;
    str0.Format("%d",loop);
    str1.Format("%s",buf);
    str1+=str0;

    p_sheet->SetTextMatrix(m_count,4,str1);

    Sleep(300);
    }


    closesocket(client);

    return 1;
    }
    另外问题触发很随机,可能跑了10分钟或是多少才会触发,所以不好调试啊。
      

  5.   

    有时候是access超出,线程超过100,很多时候也不是
    弹出对话框**指令引用的内存,该内存不能为written,取指错误了
    又找不出来,按取消调试,对应的汇编也不知道对应到那一句程序上
    望指点
      

  6.   

    另外服务器的线程处理函数
    DWORD WINAPI ClientThread(LPVOID lpParam)
    {
        SOCKET        sock=(SOCKET)lpParam;
        char          szBuff[DEFAULT_BUFFER];
        int           ret,
                      nLeft,
                      idx;
    DWORD currentID;
        while(1)
        {
            // Perform a blocking recv() call
            //
            ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);

            if (ret == 0)        // Graceful close
                break;
            else if (ret == SOCKET_ERROR)
            {
                printf("recv() failed: %d\n", WSAGetLastError());
                break;
            }
    if (ret>=1024)
    {
    MessageBox(NULL,"off","notify",0);
    break;
    }
            szBuff[ret] = '\0';
    currentID=GetCurrentThreadId();
    printf("%d__ RECV: '%s'\n ",currentID, szBuff);
          

            //
            // If we selected to echo the data back, do it 
            //
            if (!bRecvOnly)
            {
                nLeft = ret;
                idx = 0;
    //
                // Make sure we write all the data
                //
                while(nLeft > 0)
                {
                    ret = send(sock, &szBuff[idx], nLeft, 0);
                    if (ret == 0)
                        break;
                    else if (ret == SOCKET_ERROR)
                    {
                        printf("send() failed: %d\n", 
                            WSAGetLastError());
                        break;
                    }
    if (idx>17)
                    {
    MessageBox(NULL,"idx",NULL,0);
                    }
                    nLeft -= ret;
                    idx += ret;
                   }
            }
        }    return 0;
    }
    弹出的错误对话框指示的是服务器的问题,找不出是那句溢出了