same

解决方案 »

  1.   

    服务器端代码: //创建socket
    sock=socket(AF_INET,SOCK_STREAM,0);
    //绑定
    if (bind(sock,(sockaddr*)&serv,addlen))
    {
    m_edit.SetWindowText("绑定错误");
    }else
    {
    //m_list.InsertItem(count++,inet_ntoa(serv.sin_addr));
    m_edit.SetWindowText("服务器创建成功");
    //开始侦听
    listen(sock,5);
    //调用线程
    AfxBeginThread(thread,0);线程函数如下:
    UINT thread(LPVOID p)
    {
    char buff[100];
    CSize size;
    size.cx=0;
    size.cy=30;
    int s=1,msgcount,loop=1,flag=0;
    CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
    //获得客户端数量
    msgcount=dlg->getcount();
    if (msgcount==-1)//如果客户端数量达到上限则msgcount=-1
    loop=0;
    if(loop)
    {
    s=1;
    dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));//msgsock[msgcount] 一个SOCKET的数组,存放与每个客户端相连的SOCKET
          
    if (dlg->msgsock[msgcount]==INVALID_SOCKET)
    {
    dlg->m_edit.SetWindowText("Error accept");
    }
    else
    {
    //启动线程
    AfxBeginThread(thread,0);
    dlg->SetForegroundWindow();
    dlg->m_list.InsertItem(dlg->count++,"连接成功");
    dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
    dlg->m_list.Scroll(size);
    dlg->m_button.EnableWindow(TRUE);
    while(s!=SOCKET_ERROR)
    {
    //循环接收数据
    s=recv(dlg->msgsock[msgcount],buff,100,0);
    dlg->SetForegroundWindow();
    if (s!=SOCKET_ERROR)
    {
    dlg->m_list.InsertItem(dlg->count++,buff);
    dlg->m_list.Scroll(size);
    dlg->sendtoall(dlg->msgsock[msgcount],buff);
    }
    } send(dlg->msgsock[msgcount],"Disconnected",100,0);
    dlg->m_list.InsertItem(dlg->count++,"Disconnected");
    dlg->m_list.Scroll(size);
    dlg->msgsock[msgcount]=NULL;
    for (int i=0;i<50;i++)
    if (dlg->msgsock[i]!=NULL)
    flag=1;
    if (flag!=1)
    dlg->m_button.EnableWindow(FALSE);
    closesocket(dlg->msgsock[msgcount]);

    }
    }
    //终止线程
    AfxEndThread(0);
    return 0;
    }
      

  2.   

    用SOCKET数组,这样行吗?
    我以前做异步的时候用过数组,但是这种方法真能经的起考验吗?
      

  3.   

    用多线程不就行了吗!!每次有一个新的连接就其一个新的线程,然后用setect 的来判断通信中的流量,道一定的时间就可以关闭他 不就行了
      

  4.   

    建议阅读<<windows 网络编程>>
      

  5.   

    用阻塞模式,开一个线程不断在ACCEPT,来一个新的客户就新开一个线程,在线程里收发数据。