udp无法发送大于1472字节数据

时间:2023-01-12 08:06:51
最近写了一个在局域网内广播的程序,在某些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;
}

9 个解决方案

#1


ipv4定义了最小重组缓冲区大小,是576。所以还是发送小于 576-28的用户数据

如果大于576,很可能会被有的系统丢弃,不会为产生分片的ip分组重组

#2


tcp ip等层头还占空间呢

#3


udp传输不稳定

#4


不应该 虽然我没试过广播

XP
组播是可以的

会不会是机器等的设置问题?

你用SNIFFER抓一下看看

#5


上面说的我都试过了,改了设置,但还是不行!我想是因为xp系统的问题!但不知怎么解决!

#6


www.2008pq.com/bbs/Default.asp
联系QQ:147858017
(2)仿QQ,MSN TQ skype  等即时通讯源代码(DELPHI, VC++编写),,组件齐全,调试非常简单方便!
(2)发送联机或脱机消息,同时可自定义消息字体、颜色、大小等信息,支持插入表情符号,屏幕截取。
(3)好友的添加,删除,更改等操作
支持多人消息群发等功能;在线即时语音、视频聊天;
穿透网关防火墙,可在互联网和局域网任意对话;
系统采用先进的点对点通讯技术,消息(包括文本、语音、视频、文件)的
传输大多数情况不需要经服务器中转而直接发往接收者所使用的机器,传输速度更快。
而且因服务器仅仅只是起着维护用户状态列表的功能,因此占用资源极少,
可允许同时在线的人数就越多,对系统的影响也最小。
可以设置各种离线状态,支持自定义状态;
用户可自定义界面,界面皮肤可在线更新;
好友的添加,删除,更改等操作
灵活支持Oracle、Sql Server、Mysql等数据库;
服务器端资源占用低,通讯中不占用服务端资源;

########也可提供各类源代码(asp,asp.net,delphi,vc++,vb,php,等源代码 !!!!!!!!
www.2008pq.com/bbs/Default.asp
E-mail:root@2008pq.com
联系QQ:147858017

#7


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

#8


广播包最好,超过512个字节 -> 广播包最好不要超过512个字节

#9


最好不要超过512字节, 自己把数据拆了分开发, 在接收端重组一下吧, 注意考虑包顺序

#1


ipv4定义了最小重组缓冲区大小,是576。所以还是发送小于 576-28的用户数据

如果大于576,很可能会被有的系统丢弃,不会为产生分片的ip分组重组

#2


tcp ip等层头还占空间呢

#3


udp传输不稳定

#4


不应该 虽然我没试过广播

XP
组播是可以的

会不会是机器等的设置问题?

你用SNIFFER抓一下看看

#5


上面说的我都试过了,改了设置,但还是不行!我想是因为xp系统的问题!但不知怎么解决!

#6


www.2008pq.com/bbs/Default.asp
联系QQ:147858017
(2)仿QQ,MSN TQ skype  等即时通讯源代码(DELPHI, VC++编写),,组件齐全,调试非常简单方便!
(2)发送联机或脱机消息,同时可自定义消息字体、颜色、大小等信息,支持插入表情符号,屏幕截取。
(3)好友的添加,删除,更改等操作
支持多人消息群发等功能;在线即时语音、视频聊天;
穿透网关防火墙,可在互联网和局域网任意对话;
系统采用先进的点对点通讯技术,消息(包括文本、语音、视频、文件)的
传输大多数情况不需要经服务器中转而直接发往接收者所使用的机器,传输速度更快。
而且因服务器仅仅只是起着维护用户状态列表的功能,因此占用资源极少,
可允许同时在线的人数就越多,对系统的影响也最小。
可以设置各种离线状态,支持自定义状态;
用户可自定义界面,界面皮肤可在线更新;
好友的添加,删除,更改等操作
灵活支持Oracle、Sql Server、Mysql等数据库;
服务器端资源占用低,通讯中不占用服务端资源;

########也可提供各类源代码(asp,asp.net,delphi,vc++,vb,php,等源代码 !!!!!!!!
www.2008pq.com/bbs/Default.asp
E-mail:root@2008pq.com
联系QQ:147858017

#7


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

#8


广播包最好,超过512个字节 -> 广播包最好不要超过512个字节

#9


最好不要超过512字节, 自己把数据拆了分开发, 在接收端重组一下吧, 注意考虑包顺序