在用UDP接受数据时小的数据包能收到,大的就完全丢失了。
发送方是java编写的server,当使用java的客户端接收时是不管数据大小都能收到,而VC的客户端只能收到小于1K多的数据,这是什么问题?发送也有类似问题

解决方案 »

  1.   

    对呀,udp 包的长度是有限制的,不能超过单个包的长度。
    超过部分应该用下一个报发送。
      

  2.   

    是不是VC的客户端BUFFER太少了
    设置UDP的接收和发送的BUFFER看看
      

  3.   

    设置了,buffer是大于发送的数据的。但是发送大数据的时候一个包都没有收到,而用java的却能收到。
      

  4.   

    我是收包,发包是由java的程序来完成了,另外还有一个java的client能收到他发出的大数据包,而我的vc程序只能收到小于1500的数据包。
      

  5.   

    我估计java自己能做这方面的处理。而用vc则需要自己处理。
    能贴出程序吗
      

  6.   

    下面是接受部分的代码: fd_set fdRead  = { 0 };
    TIMEVAL stTime;
    TIMEVAL *pstTime = NULL;

    if ( INFINITE != dwTimeout ) {
    stTime.tv_sec = 0;
    stTime.tv_usec = dwTimeout*1000;
    pstTime = &stTime;
    }

    SOCKET s = (SOCKET) m_hSocket;
    // Set Descriptor
    if ( !FD_ISSET( s, &fdRead ) )
    FD_SET( s, &fdRead );

    // Select function set read timeout
    DWORD dwBytesReceive = 0L; int res = select( s+1, &fdRead, NULL, NULL, pstTime);
    byte buffer[2048];
    SOCKADDR_IN sockfrom;
    int nlen=sizeof(sockfrom); int start=0;
    OutputDebugString(_T("CDataGramSocket::Receive  begin receive\n"));
    res = recvfrom( s, (LPSTR)buffer, 2048, 0,(SOCKADDR*)(&sockfrom),&nlen);
    // while((res = recvfrom( s, (LPSTR)buffer, 2048, 0,(SOCKADDR*)(&sockfrom),&nlen))!=WSAEMSGSIZE){
    if(res==SOCKET_ERROR){
    OutputDebugString(_T("CDataGramSocket::Receive  recvfrom error\n"));
    CMyString str=CMyString("error code:")+*IntToString(GetLastError());
    OutputDebugString(ToWideChar(str.cstr(),str.length()));
    OutputDebugString(_T("\n"));
    return -1;
    }
    if(res==WSAEMSGSIZE){
    OutputDebugString(_T("CDataGramSocket::Receive  recvfrom WSAMSGSIZE\n"));
    CMyString str=CMyString("error code:")+*IntToString(GetLastError());
    OutputDebugString(ToWideChar(str.cstr(),str.length()));
    OutputDebugString(_T("\n"));
    }
    // TCHAR Addr[128];
    // MultiByteToWideChar(CP_ACP,0,inet_ntoa(sockfrom.sin_addr),strlen(inet_ntoa(sockfrom.sin_addr)),Addr,128);
    CMyString str=CMyString("CDataGramSocket::Receive from ")+CMyString(inet_ntoa(sockfrom.sin_addr)).trim()
    +CMyString(":")+*IntToString(ntohs(sockfrom.sin_port)) +CMyString("  ")
    +*IntToString(res)+CMyString(" bytes\n");
    OutputDebugString(ToWideChar(str.cstr(),str.length()));
    arraycopy(buffer,0,lpBuffer,start,res);
    // start+=res;
    // };
      

  7.   

    有一个是注释掉了,都给copy过来了。据我的了解是,java的DataGramSocket在收发大数据包时是自己会处理的,但是他发送的包处理后都是应该是网络能够接受的包吧,我怎么会一点都收不到呢?
      

  8.   

    用我的程序吗?有没有改什么地方?
    不过我是在WinCE上做的程序,如果这样那估计可能是CE的问题不是我程序的问题了。
    不过java的程序在ce下也是能正常,这就奇怪了。