现在有一个server程序,两个client(client1,client2)程序运行,我把client的那个工程用vs打开了两次然后分别运行,与server建立连接,然后实现数据传输(client发送数据,然后server回发),我本来想连接之后,server向两个client同时发送相同的数据(比如client1向server发送数据,server同时向client1和client2发送数据),但是实际运行起来,是谁向server发送,server向谁发送。
linux下实现这种问题好像是用fork(),但是window没有fork()啊,听说createThread可以,但是查了一下好像很复杂,而且据说会发生内存泄露,不推荐使用。怎么办?有哪位可以帮忙解答一下MFC数据传输 socket

解决方案 »

  1.   

    server维护一个client的socket list,然后遍历list,依次给各个socket发送send数据
      

  2.   

    如果给两个客户发送同样的数据,可以用多播,这有socket的源码,你看一下Sntp:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  3.   


    你自己用个链表保存客户端的SOCKET句柄等相关信息,这个当然需要动态维护,比如客户离开,需要从链表中删除。
      

  4.   

    加锁什么的完全不会啊…这是我那部分核心代码
    能说说具体怎么加在哪加吗?
    CSocket aSocket;
    list <CSocket> serverSocket(2);
    list <CSocket>::iterator i = serverSocket.begin();
    if (!aSocket.Socket())
    {
    char szError[256] = {0};

    sprintf(szError, "Create Faild: %d", GetLastError());

    AfxMessageBox(szError);

    return 1; 
    } BOOL bOptVal = TRUE;
    int bOptLen = sizeof(BOOL); aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);


    if (!aSocket.Bind(nPort))
    {
    char szError[256] = {0};

    sprintf(szError, "Bind Faild: %d", GetLastError());

    AfxMessageBox(szError);

    return 1; 
    }

    if(!aSocket.Listen(10))
    {
    char szError[256] = {0};
    sprintf(szError, "Listen Faild: %d", GetLastError());
    AfxMessageBox(szError);
    return 1;
    }

    CString strText;

    aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);

    strText += "Server Start! \r\n";

    aDlg->SetDlgItemText(IDC_EDIT_LOG, strText); while(!m_exit)
    {

    if(!aSocket.Accept(*i))
    {
    continue;
    }
    else
    {
    char szRecvMsg[256] = {0};
    char szOutMsg[256] = {0}; i->Receive(szRecvMsg, 256); sprintf(szOutMsg, "%s \r\n", szRecvMsg);

    aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);

    strText += szOutMsg;

    aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
    for (i = serverSocket.begin();i!=serverSocket.end();i++)
    {
    i->Send("hhhhh",50);
    i->Close();
    }
    }
    i--;
    }

    aSocket.Close();
      

  5.   

    我这么加了 可是还是运行不对
    CSocket aSocket;
    list <CSocket> serverSocket(2);
    list <CSocket>::iterator i = serverSocket.begin();
    if (!aSocket.Socket())
    {
    char szError[256] = {0};

    sprintf(szError, "Create Faild: %d", GetLastError());

    AfxMessageBox(szError);

    return 1; 
    } BOOL bOptVal = TRUE;
    int bOptLen = sizeof(BOOL); aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);


    if (!aSocket.Bind(nPort))
    {
    char szError[256] = {0};

    sprintf(szError, "Bind Faild: %d", GetLastError());

    AfxMessageBox(szError);

    return 1; 
    }

    if(!aSocket.Listen(10))
    {
    char szError[256] = {0};
    sprintf(szError, "Listen Faild: %d", GetLastError());
    AfxMessageBox(szError);
    return 1;
    }

    CString strText;

    aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);

    strText += "Server Start! \r\n";

    aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
    InitializeCriticalSection( & cs);
    while(!m_exit)
    {

    EnterCriticalSection( & cs);
    if(!aSocket.Accept(*i))
    {
    continue;
    }
    else
    {
    char szRecvMsg[256] = {0};
    char szOutMsg[256] = {0}; i->Receive(szRecvMsg, 256); sprintf(szOutMsg, "%s \r\n", szRecvMsg);

    aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);

    strText += szOutMsg;

    aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
    for (i = serverSocket.begin();i!=serverSocket.end();i++)
    {
    i->Send("hhhhh",50);
    i->Close();
    }
    }
    i--;
    LeaveCriticalSection( & cs);
    }
      

  6.   

    楼主知道Select模型么?
    完全可以做到Server对Client 1对多的情况
      

  7.   

    百度了一下看了好久,感觉不太懂,刚学socket编程,而且一直都是linux的,这次让用mfc实现一楼说的这个东西,感觉好迷茫啊
      

  8.   

    CSocket aSocket;
    list <CSocket> serverSocket(2);
    list <CSocket>::iterator i = serverSocket.begin();
    if (!aSocket.Socket())//这是要干嘛
    {
    char szError[256] = {0};

    sprintf(szError, "Create Faild: %d", GetLastError());

    AfxMessageBox(szError);

    return 1; 
    } BOOL bOptVal = TRUE;
    int bOptLen = sizeof(BOOL);
    aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);


    if (!aSocket.Bind(nPort))//aSocket.Create在哪里?木有创建你就要绑定了?后面的我都不想看了
    {
    char szError[256] = {0};

    sprintf(szError, "Bind Faild: %d", GetLastError());

    AfxMessageBox(szError);

    return 1; 
    }

    if(!aSocket.Listen(10))
    {
    char szError[256] = {0};
    sprintf(szError, "Listen Faild: %d", GetLastError());
    AfxMessageBox(szError);
    return 1;
    }

    CString strText;

    aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);

    strText += "Server Start! \r\n";

    aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
    InitializeCriticalSection( & cs);
    while(!m_exit)
    {

    EnterCriticalSection( & cs);
    if(!aSocket.Accept(*i))
    {
    continue;
    }
    else
    {
    char szRecvMsg[256] = {0};
    char szOutMsg[256] = {0}; i->Receive(szRecvMsg, 256); sprintf(szOutMsg, "%s \r\n", szRecvMsg);

    aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);

    strText += szOutMsg;

    aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
    for (i = serverSocket.begin();i!=serverSocket.end();i++)
    {
    i->Send("hhhhh",50);
    i->Close();
    }
    }
    i--;
    LeaveCriticalSection( & cs);
    }
      

  9.   

    第一行声明了一个socket,第四行判断是否创建成功啊,已经成功了,为什么不能绑定呢?
    顺便说一句,不加那些容器的话运行成功,这能说明什么呢,难道没有创建socket还能成功运行?