最近写了一个在局域网内广播的程序,在某些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;
}
// 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;
}
组播是可以的会不会是机器等的设置问题?你用SNIFFER抓一下看看