发送超过1500的数据包

在xp下 使用sendto发送超过1500的数据包(sendto返回值正常),但是使用recvfrom却不能接受到,使用sniffer 发现数据包确实已经发送成功。监控程序的SO_RCVBUF,SO_SNDBUF和SO_MAX_MSG_SIZE均为默认正常值。  
   
  如果在xp上发送小于1500的数据包,一切正常!  
   
  是同样的程序(大于1500或者小于1500的数据包都)在win2000上能正常发送和接受。  
   
  源代码如下:  
   
  服务端:  
  #include<stdlib.h>  
  #include<iostream.h>  
  #include<stdio.h>  
  #include<conio.h>  
  #include<winsock2.h>  
  #include<windows.h>  
   
  #pragma   comment(lib,"ws2_32.lib")  
  main()  
  {  
  SOCKET   s;  
  sockaddr_in   addrto;  
  WSADATA   wsdata;  
  BOOL   bsocket;  
  char   *smsg="this   is   a   test";  
  //启动SOCKET库,版本为2.0  
  WSAStartup(0x0202,&wsdata);  
   
  s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);  
  bsocket=TRUE;  
        //然后赋值给地址,用来从网络上的广播地址接收消息;  
  addrto.sin_family=AF_INET;  
          addrto.sin_addr.s_addr=INADDR_BROADCAST;  
  addrto.sin_port=htons(5050);  
  bool   opt=true;  
  //设置该套接字为广播类型,  
  setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char   FAR   *)&opt,sizeof(opt));  
  int   nlen=sizeof(addrto);  
  while(1)  
  {  
  Sleep(1000);  
  //从广播地址发送消息  
  int   ret=sendto(s,smsg,1500,0,(sockaddr*)&addrto,nlen);  
  if(ret==SOCKET_ERROR)  
  cout<<WSAGetLastError()<<endl;  
  else  
  {  
  printf("ok");  
  }  
  }  
  }  
   
  客户端:  
   
  #include<stdlib.h>  
  #include<iostream.h>  
  #include<conio.h>  
  #include<stdio.h>  
  #include<winsock2.h>  
  #include<windows.h>  
  #pragma   comment(lib,"ws2_32.lib")  
   
  void   main(void)  
  {  
  SOCKET   s;  
  sockaddr_in   from,a;  
  WSADATA   wsdata;  
  BOOL   optval;  
  //启动SOCKET库,版本为2.0  
  WSAStartup(0x0202,&wsdata);  
  optval=TRUE;  
  //然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;  
  a.sin_family=AF_INET;  
  a.sin_addr.s_addr=0;  
  a.sin_port=htons(5050);  
   
  from.sin_family=AF_INET;  
  from.sin_addr.s_addr=INADDR_BROADCAST;  
  from.sin_port=htons(5050);  
   
  int   fromlength=sizeof(SOCKADDR);  
  //用UDP初始化套接字  
  s=socket(AF_INET,SOCK_DGRAM,0);  
      //设置该套接字为广播类型,  
  setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char   FAR   *)&optval,sizeof(optval));  
  bind(s,(sockaddr   *)&a,sizeof(sockaddr_in));  
  char   buf[1600];  
  while(1)  
  {//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的  
  recvfrom(s,buf,1600,0,(struct   sockaddr   FAR   *)&from,(int   FAR   *)&fromlength);  
  Sleep(2000);  
  printf("%s/n",buf);  
  ZeroMemory(buf,1600);  
  }  
  }  
   
  该测试代码在2000下一切正常,但是在xp上不行,如果改sendto的数据包为1400,则一切正常!  
   
  望各位指点........谢谢....  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值