TCP服务器接受一客户数据,转发问题?
TCP服务器接受一客户端发送的数据,把数据转发给其他多个客户端,请文如何做?
给点提示,谢谢?

解决方案 »

  1.   

    如果其它终端有登录到服务器,A终端在发起信息到B终端时,加上B终端的ID号或其它唯一值,再由服务器转发都可以
      

  2.   

    把所有登陆的客户端记录到服务器的一个数据结构中(比如Array,Map,List等),然后,要转发时遍历这个结构发送就是了
      

  3.   


    #include <stdio.h>
    #include <WINSOCK2.H>
    #include <process.h>#pragma comment(lib,"ws2_32.lib")void WorkThread(LPVOID lpParam)
    {
    SOCKET sockSvr=(SOCKET)lpParam;
    fd_set readSet;
    int ret;
    timeval tv;
    char buf[5000];
    unsigned int PackLen=0;//20100930
    while (1)
    {
    FD_ZERO(&readSet);
    FD_SET(sockSvr,&readSet);
    tv.tv_sec=15;//5;
    tv.tv_usec=0;
    ret=select(0,&readSet,NULL,NULL,&tv);
    if(ret==SOCKET_ERROR||ret==0)
    {
    printf("Select error (%d) or Timeout!\n",WSAGetLastError());
    break;;
    }
    if (FD_ISSET(sockSvr,&readSet))
    {
    memset(buf,0,5000);
    ret=recv(sockSvr,buf,5000,0);
    PackLen+=ret;//20100930
    if(ret==SOCKET_ERROR || ret==0)
    {
    printf("recv error (%d) or Timeout!\n",WSAGetLastError());
    break;
    }

    //printf("Socket %d recv: %s\n",sockSvr,buf);
    printf("Socket %d recv: %d\n",sockSvr,PackLen);//20100930
    ret=send(sockSvr,buf,strlen(buf),0);
    if(ret==SOCKET_ERROR) break;
    }

    }
    closesocket(sockSvr);
    }int main(int argc,char *argv[])
    {
    WSAData wsaData;
    WSAStartup(WINSOCK_VERSION,&wsaData); SOCKET sockListen=socket(AF_INET,SOCK_STREAM,0);
    bool bReuseAddr=true;
    setsockopt(sockListen,SOL_SOCKET,SO_REUSEADDR,(char *)bReuseAddr,sizeof(bReuseAddr));
    struct sockaddr_in local;
    memset(&local,0,sizeof(local));
    local.sin_addr.s_addr=INADDR_ANY;
    local.sin_family=AF_INET;
    local.sin_port=htons(8801);
    if(bind(sockListen,(struct sockaddr *)&local,sizeof(local))==SOCKET_ERROR)
    {
    printf("bind:%d\n",WSAGetLastError());
    closesocket(sockListen);
    WSACleanup();
    return -1;
    }
    if(listen(sockListen,5)==SOCKET_ERROR)
    {
    printf("listen:%d\n",WSAGetLastError());
    closesocket(sockListen);
    WSACleanup();
    return -1;
    } SOCKET sockAccept;
    while(true)
    {
    sockAccept=accept(sockListen,NULL,NULL);
    if(sockAccept==INVALID_SOCKET)
    break;
    else
    _beginthread(WorkThread,0,(LPVOID)sockAccept);
    }
    closesocket(sockListen);
    WSACleanup();
    return 0;
    }
    直接发送其他客户端,就没有数据了?
      

  4.   

    一下是伪代码,仅仅为了说明问题:初始化socket环境
    创建socket
    bind
    listen
    ---------------------------------------
    -----------以上代码略-------------------
    ---------------------------------------CDWordArray socketArray;------------关键代码--------------------
    socket client = -1;
    client = accept(server,NULL,NULL);
    //将新连接的客户端添加到结构中
    socketArray.Add(client);
    -----------你的相关处理略----------------DWORD RecvThread(LPVOID lparam)
    {
        char buf[1024];
        int len  = recv(client,buf,1024,0);
        //遍历所有客户端,转发数据
        for(int i=0;i<socketArray.GetCount();i++)
        {
           socket client = socketArray[i];
           send(client,buf,len,0);
        }
    }
    以上仅仅是一些说明代码,仅供参考