关于UDP一次最大传输量的问题?

mmhhj 2002-05-20 05:20:46
各位大侠,可知道一次udp最多传输多少字节。
下面是我写的一段程序,当MAXBUFF=1024*11时,发送接受都正常,
但是定义成1024*12时,发送段sendto返回值是MAXBUFF,但是接受端始终没有反应,
请大家看看是社么问题。


//udp发送接受程序



#include <stdio.h>
#include <conio.h>
#include <winsock.h>

#define MAXBUFF 1024*12
char* sendBuff,*cRecvBuff;
int main(int argc, char* argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saUdpServ,saClient;
BOOL fBroadcast = TRUE;
struct hostent *ptrHost;
char w,isServer;
int nSize,nbSize;
int ncount=0;
int solval;
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
return -1;
}
/*如果带参数程序为用户端,后面跟服务端机器名。如果不带参数为服务端程序*/
if(argc==1)isServer=1;
else isServer=0;
sockListener=socket(AF_INET,SOCK_DGRAM,0);
// setsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST,(CHAR *)&fBroadcast,sizeof ( BOOL ));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr=htonl(INADDR_ANY);
if(isServer)
sin.sin_port = htons(7001);
else
sin.sin_port = htons(0);
if(isServer)
cRecvBuff=(char*)malloc(MAXBUFF);
else
sendBuff=(char*)malloc(MAXBUFF);

if(bind( sockListener, (SOCKADDR *)&sin, sizeof(sin))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
return -1;
}
//unuseful
getsockopt(sockListener,SOL_SOCKET,SO_RCVBUF,(char *)&solval,&nbSize);
printf("SO_RCVBUF is %d\n",solval);
getsockopt(sockListener,SOL_SOCKET,SO_SNDBUF,(char *)&solval,&nbSize);
printf("SO_SNDBUF is %d\n",solval);
/* getsockopt(sockListener,SOL_SOCKET,SO_MAX_MSG_SIZE,(char *)&solval,&nbSize);
printf("SO_MAX_MSG_SIZE is %d\n",solval);
solval=1024*20;
nbSize=sizeof(solval);
setsockopt(sockListener,SOL_SOCKET,SO_SNDBUF,(char *)&solval,sizeof(solval));
setsockopt(sockListener,SOL_SOCKET,SO_RCVBUF,(char *)&solval,sizeof(solval));
*/

saUdpServ.sin_family = AF_INET;
ptrHost=gethostbyname(argv[1]);
memcpy((char *) &(saUdpServ.sin_addr),
ptrHost->h_addr, ptrHost->h_length);
saUdpServ.sin_port = htons (7001);//发送用的端口,可以根据需要更改
nSize = sizeof ( SOCKADDR_IN );
while(1)
{
w=_kbhit();
if(w)
break;
if(!isServer)
{
sprintf(sendBuff,"Message %d",ncount++);
nbSize=sendto ( sockListener,sendBuff,
MAXBUFF,
0,
(SOCKADDR *) &saUdpServ,
sizeof ( SOCKADDR_IN ));
if(nbSize==MAXBUFF)
printf("Send %dBytes:%s\n",nbSize,sendBuff);
Sleep(1000);
}
else
{
if((nbSize=recvfrom (sockListener,cRecvBuff,MAXBUFF,0,
(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR)
{
printf("Recive Error");
break;
}
printf("Receive %dBytes:%s\n",nbSize,cRecvBuff);
}
}
return 0;
}
...全文
210 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bao 2002-05-20
  • 打赏
  • 举报
回复
因为UDP是无连接的协议,并不保证数据的可靠发送,所以其发送函数的返回值并不代表实际传输的数据量。
建议将IP分组中的有效数据(大概是1460B吧)视为一个数据报,自己进行再进行一次数据的封装,定义自己的协议报头(如类型、长度等),服务器接收到后再做必要的校验和应答,这样在处理多个客户请求时也容易些。如果通信流量不是很大而且网络环境比较好的话,应答过程也可省略,因为这样的数据报一般不会丢失。
xuying 2002-05-20
  • 打赏
  • 举报
回复
是不是接收端缓冲区不够大?
RSRR 2002-05-20
  • 打赏
  • 举报
回复
劝你超过1000时不用,或加一些校验手段。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧