我在对话框里initdialog里
socket()  bind()  listen(listensocket,5)
之后,现在想对处理连接和收发信息,知道要accept()
但放在哪里,放在listen()后好象不行,于是想开线程处理多连接,又不知道如何开法?请指导我,并告诉我如何修改连接数,令连接数不低于五

解决方案 »

  1.   

    在服务器端开一个监听线程,接收到连接后在开服务线程。
    example:
    //
    //TCP·þÎñÆ÷¶Ë¼àÌýÏß³Ì
    //
    UINT TCPServerListenThread(LPVOID pParam)
    {
    while (1)
    {
    CWinThread*  hHandle;  // Ï߳̾ä±ú
    SOCKET  clientSocket;  //¿Í»§socket //µÈ´ýÁ¬½Ó£¬×èÈû
    clientSocket = accept(((MySocket*)pParam)->hSocket,0,0); 

    InterlockedIncrement(&g_nConnecttedSocket);//Á¬½ÓÊýÔö¼Ó //ÓÐÁ¬½Óʱ£¬´´½¨ÈÎÎñ
    hHandle=AfxBeginThread(TCPServerThread,(LPVOID)clientSocket);
    }

    return 1;
    }
    //
    //TCP·þÎñÆ÷¶Ë·þÎñÏß³Ì
    //
    UINT TCPServerThread(LPVOID pParam)
    {
        SOCKET ClientSocket = (SOCKET)pParam;
    char buffer[MAX_BUFFER_SIZE];
    char pBuf[30];
    WORD  iLength = 0;
    WORD iTimes = 0;

    while (1)
    {
    ZeroMemory(pBuf,sizeof(pBuf));

    //¸ø¿Í»§¶Ë·¢ËÍÁ¬½ÓÈ·ÈÏÐÅÏ¢
    // CopyMemory(pBuf,"connectted",10);
    // send(ClientSocket,pBuf,10,0); int len = recv(ClientSocket,pBuf,sizeof(pBuf),0);
    if (len > 0) //ÊÕµ½Êý¾Ý
    {
                          do something
    if (SOCKET_ERROR == sendLen)
    {
    closesocket(ClientSocket);
    return 0;
    }
    InterlockedExchangeAdd(&g_nCurrentBPS,sendLen);
    }

    closesocket(ClientSocket);

    //InterlockedDecrement(&g_nConnecttedSocket);//Á¬½ÓÊý¼õÉÙ
    return 1;
    }
    else if(0 == len)//Á¬½Ó¹Ø±Õ
    {
    closesocket(ClientSocket);
    return 0;
    }
    } return 1;
    }
      

  2.   

    ?????
    accept部分看不出什么问题
    应该可以正常工作的
      

  3.   

    大哥,再给我传一遍,我看不清楚啊,要整理又费时间,另外在initdialog如何开线程, 是直接跟在listen之后就createthread(...TCPServerListenThread....)吗?
      

  4.   

    不用开线程,你建立一个socket类,专门用于和客户端通信。accept()后得到一个socket句柄,把这个句柄传递给socket类,让它和客户端通信就可以了。
      

  5.   

    在listen后,调用
    CWinThread*  hHandle; 
    hHandle=AfxBeginThread(TCPServerListenThread,(LPVOID)this);TCPServerListenThread函数体:
    UINT TCPServerListenThread(LPVOID pParam)
    {
    while (1)
    {
    CWinThread*  hHandle;
    SOCKET  clientSocket;
    clientSocket = accept(((MySocket*)pParam)->hSocket,0,0);  hHandle=AfxBeginThread(TCPServerThread,(LPVOID)clientSocket);
    }

    return 1;
    }UINT TCPServerThread(LPVOID pParam)
    {
        SOCKET ClientSocket = (SOCKET)pParam; while (1)
    {
              收/发数据
    } return 1;
    }
      

  6.   

    基于事件的socket通讯可以不用多线程,但效率太低
      

  7.   

    server:
    Create(PORT);
    Listen();
    while(Accept(new socket object))
    {
    new socket object.Receive(buffer)
    }
    Client:
    Create();
    connect(ip,port);
    send...
    就是这种模式
      

  8.   

    while(1){//服务器永远循环服务
    //侦听
    ret = listen(m_hSocket, 2);
    if(ret == SOCKET_ERROR){
    cout<<"Listen Error: %d \n";                   return ;
    }
    //
    SOCKET s = accept(m_hSocket, NULL, NULL);
    if(s == SOCKET_ERROR){
    cout<<"Accept Error: %d \n";
    return ;
    }
    cout<<"客户连接成功!\n";
    //
    char buff[256];
    ret = recv(s, buff, 256, 0);
    if(ret == 0 || ret == SOCKET_ERROR ){
    cout<<"Recv data error: %d\n";//, WSAGetLastError());
    return ;
    }
    /**
    4   处理客户消息
    **/
                }
      

  9.   

    如果请求的连接能够被及时的接受(accept()),不会产生连接数的问题。如果希望响应良好,一般需要在辅助线程调用accept(),
    又因为默认情况下,accept()、send()、recv()都会阻塞,所以接受一个连接后,还需要再启动一个线程来实现数据的传送。大概需要这样,
    在主线程:
    socket();
    bind();
    listen();
    启动接受连接的线程;  // 把socket作为参数传递,或通过全局变量传递在接受连接的线程:
    循环 {
    SOCKET s_conn = accept();  // 需要确认没有错误
    启动数据传送线程;   // 把s_conn作为参数传递,此处不能用全局变量,因为可能接受多个连接
    }  // 循环// 另有一种做法是在这个线程进行数据的传送,开启新的线程继续accept()在数据传送线程:
    .....
    send();
    .....
    recv();
    ......
    return exit_code;
      

  10.   

    不要忘了当一个socket不再需要时,要closesocket()