UDP服务端创建了四个套接字,端口为6000-6003 绑定好后,客户端向服务器其中一个端口发送请求。服务器收到以后保存客户端的SOCKADDR_IN地址。然后客户端分别向服务器4个端口发数据,结果服务器都能接收成功,客户端却只能收到第一次发送请求时那个端口来的数据,原因何在?

解决方案 »

  1.   


    我的代码是C++,实现方式是,在服务器任意一个监听中保存客户端的SOCKADDR_IN后,客户端向服务器各个端口放数据,服务器收到以后马上回复。在本地测试正常,放服务器就出问题。
      

  2.   

    SOCKET sock[4];
    SOCKADDR_IN userAddr;
    SOCKADDR_IN si;
    si.sin_family = AF_INET;
    si.sin_addr.S_un.S_addr = INADDR_ANY;//创建线程
    for(int i=0; i < THREAD_NUM; ++i)
    {
        si.sin_port = htons(6000 + i);
        sock[i] = socket(AF_INET,SOCK_DGRAM,0);
        if(bind(sock[i], (sockaddr*)&g_si, sizeof(g_si)) == SOCKET_ERROR)
        {
    MessageBox(_T("绑定失败!"));
    return;
        }
        HANDLE hThreadHandle = CreateThread(NULL, 0, ServerThread, (LPVOID)i, 0, 0);
        if (hThreadHandle == NULL)
        {
    MessageBox(_T("创建线程失败!"));
    return;
        }
        CloseHandle(hThreadHandle);}//监听
    DWORD WINAPI CUdpGameServerDlg::ServerThread (LPVOID lpParam)
    {
         DWORD dwTrans;
         DWORD nFlags = 0;
         int nLen = sizeof(SOCKADDR);     SOCKADDR_IN addrClient;
         char tem[BUFFER_SIZE];     WSABUF buf;
         buf.buf = tem;
         buf.len = BUFFER_SIZE;
         int ThreadID = (int)lpParam;     while(TRUE)
         {
    WSARecvFrom(sock[ThreadID], &buf, 1, &dwTrans, &nFlags, (sockaddr*)&addrClient, &nLen, NULL, NULL);        switc(dwTrans)
            {
                case packLen:
                {
                    WSASendTo(sock[ThreadID], &buf, 1, &dwTrans, nFlags, (sockaddr*)&userAddr,nLen, NULL, NULL);
                    break;
                }
                case loginLen:
                {
                   userAddr = addrClient;
                   break;
                }
                defalut:break;
            }
    }