最近写了一个在局域网内广播的程序,在某些2003下调试正常!但在所有的xp下,当广播数据超过1472时,数据发送成功,但接收不到!我知道,1472=1500-28(高手们应该知道这是什么意思吧),但ip层不是自动为大于1500的数据包分片吗?而为什么在一些2003(本人的机器是2003)下就好使呢?测试程序如下,高手们请看看!
// Broadcast.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <windows.h>
#include <winsock.h>int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET mySocket;
int err,i;
SOCKADDR_IN sin,saUdpServ;
    BOOL fBroadcast = TRUE;
    float sendBuff[500];
    int nSize;
    int ncount=0; err=WSAStartup(MAKEWORD(2,0),&wsaData);
if(err!=0)
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
        return -1;
}
  mySocket=socket(PF_INET,SOCK_DGRAM,0);
  setsockopt ( mySocket,SOL_SOCKET,SO_BROADCAST,(CHAR *)&fBroadcast,sizeof ( BOOL ));
  sin.sin_family = AF_INET;
  sin.sin_port =htons(0);
  sin.sin_addr.s_addr = htonl(INADDR_ANY);
  if(bind( mySocket, (SOCKADDR *)&sin, sizeof(sin))!=0)
    {
        printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
        return -1;
    }
  saUdpServ.sin_family = AF_INET;
  saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );
  saUdpServ.sin_port = htons (8000);//发送用的端口,可以根据需要更改
  nSize = sizeof ( SOCKADDR_IN );
  for(;;)
{
//sprintf(sendBuff,"Message %d",ncount++);
        int aa=sendto (mySocket,(char *)sendBuff,
            sizeof(sendBuff),
            0,
            (SOCKADDR *) &saUdpServ,
            sizeof ( SOCKADDR_IN ));
        printf("%f\n",sendBuff[1]);
Sleep(2000);
         }

return 0;
}

解决方案 »

  1.   

    ipv4定义了最小重组缓冲区大小,是576。所以还是发送小于 576-28的用户数据如果大于576,很可能会被有的系统丢弃,不会为产生分片的ip分组重组
      

  2.   

    不应该 虽然我没试过广播XP
    组播是可以的会不会是机器等的设置问题?你用SNIFFER抓一下看看
      

  3.   

    广播包最好,超过512个字节,msdn上有详细说明,ip是能重组的,你发不了大包,不是因为udp,是因为广播包,这个操作系统有限制