Udp传输慢的问题

tonyzhengjq 2006-09-29 11:39:31
看下面代码,在本地传输很快,放到公网上,测试要掉50%包,我实在看不出什么原因,请大侠们指出有改进的地方!有成效马上结贴

//客户端
#include "stdafx.h"

#define ServerIp "203.88.194.32"

#define LocalIP ServerIp
//#define LocalIP "192.168.1.100"
//#define ServerIp "203.88.194.32"

apr_socket_t* sock_g;
apr_pool_t* pool_g;
apr_sockaddr_t* sa_g;

#define PackSize 256

char szBuffer_g[PackSize];

u_long InitSock()
{
apr_initialize();
apr_pool_create(&pool_g, NULL);

return 0;
}


u_long CreateUDP(const char* pcHostName, u_short nPort)
{

if (apr_sockaddr_info_get(&sa_g, pcHostName, APR_INET, nPort, 0, pool_g) != 0)
return 1;

if (apr_socket_create(&sock_g, sa_g->family, SOCK_DGRAM, APR_PROTO_UDP, pool_g) != 0)
return 1;

if (apr_socket_bind(sock_g, sa_g) != 0)
return 1;

return 0;
}


void main()
{
memset(szBuffer_g, 'a', sizeof(szBuffer_g));
InitSock();

if (CreateUDP("192.168.1.100", 8200) != 0)
{
cout << "Socket Create Error!" << endl;
return;
}

apr_sockaddr_t* from = NULL;

if (apr_sockaddr_info_get(&from, LocalIP, APR_INET, 8800, 0, pool_g) != 0)
{
cout << "apr_sockaddr_info_get Error" << endl;
return;
}

u_long one = 1;

if (ioctlsocket(sock_g->socketdes, FIONBIO, &one) == SOCKET_ERROR) {
cout << "ioctlsocket Error: " << apr_get_netos_error() << endl;
}


u_short nRv = 0;
u_int len = PackSize;
u_long ulCount = 0;

fd_set fdR;

DWORD dw_Time = GetTickCount();
while (1)
{
FD_ZERO(&fdR);

FD_SET(sock_g->socketdes, &fdR);

if (select(0, NULL, &fdR ,NULL, NULL) == SOCKET_ERROR)
{
cout << "select Error!" << endl;
continue;
}

len = PackSize;


nRv = apr_socket_sendto(sock_g, from, 0, szBuffer_g, &len);

if (nRv != 0)
{
cout << "apr_socket_sendto Error:" << nRv << endl;
Sleep(1000);
continue;
}


ulCount++;

if (!(ulCount % 1))
{
Sleep(10);
}
if (!(ulCount % 1))
{

cout << "Count:" << ulCount << endl;
}

if (ulCount == 2500)
{
strcpy(szBuffer_g, "END");
continue;
}

if (szBuffer_g[0] == 'E')
{
cout << "time-consuming is:" << GetTickCount() - dw_Time << endl;
Sleep(2 * 1000);
break;
}
}

Sleep(1000);
apr_socket_close(sock_g);

apr_pool_clear(pool_g);

system("pause");
}
//服务端
#include "stdafx.h"

#define ServerIp "203.88.194.32"

#define LocalIP ServerIp

//#define LocalIP "192.168.1.100"
//#define ServerIp "203.88.194.32"

apr_socket_t* sock_g;
apr_pool_t* pool_g;
apr_sockaddr_t* sa_g;

#define PackSize 256

char szBuffer_g[PackSize] = {0};

u_long InitSock()
{
apr_initialize();
apr_pool_create(&pool_g, NULL);

return 0;
}


u_long CreateUDP(const char* pcHostName, u_short nPort)
{

if (apr_sockaddr_info_get(&sa_g, pcHostName, APR_INET, nPort, 0, pool_g) != 0)
return 1;

if (apr_socket_create(&sock_g, sa_g->family, SOCK_DGRAM, APR_PROTO_UDP, pool_g) != 0)
return 1;

if (apr_socket_bind(sock_g, sa_g) != 0)
return 1;

return 0;
}

void main()
{
char buffer[PackSize];
memset(szBuffer_g, 'a', sizeof(szBuffer_g));
InitSock();

if (CreateUDP(LocalIP, 8800) != 0)
{
cout << "Socket Create Error!" << endl;
return;
}

u_long one = 1;

if (ioctlsocket(sock_g->socketdes, FIONBIO, &one) == SOCKET_ERROR) {
cout << "ioctlsocket Error: " << apr_get_netos_error() << endl;
}

apr_sockaddr_t* from = NULL;
u_short nRv = 0;
u_int len = PackSize;
u_long ulCount = 0;

fd_set fdR;


while (1)
{
FD_ZERO(&fdR);

FD_SET(sock_g->socketdes, &fdR);

if (select(0, &fdR, NULL ,NULL, NULL) == SOCKET_ERROR)
{
cout << "select Error!" << endl;
continue;
}

len = PackSize;

nRv = apr_socket_recvfrom(sa_g, sock_g, 0, buffer, &len);

if (nRv != 0)
{
cout << "apr_socket_recvfrom Error:" << nRv << endl;
Sleep(1000);
continue;
}

ulCount++;

if (memcmp(buffer, szBuffer_g, sizeof(szBuffer_g)) != 0)
{
cout << "Buffer is Not All" <<endl;
// break;
}

cout << "Count:" << ulCount << endl;

if (strcmp(szBuffer_g, "END") == 0)
{
cout << "Count:" << ulCount << endl;
break;
}
}

apr_socket_close(sock_g);

apr_pool_clear(pool_g);

system("pause");
}
...全文
669 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
f_acme 2006-10-02
  • 打赏
  • 举报
回复
把UDP发送缓冲区和接收缓冲区加大点试下
tonyzhengjq 2006-10-02
  • 打赏
  • 举报
回复
如果解决问题,加我QQ25645739 我可以给分1000
tonyzhengjq 2006-10-02
  • 打赏
  • 举报
回复
我是网通用户,对方是电信啊!我的项目主要是穿内网实现P2P共享!实现BT大文件下载,重发机制,Md5文件块验证,网络自动调速,我都已经实现,可是网通用户和电信之间太慢!为什么用QQ传文件又很快!?????????我想知道QQ用UDP是什么原理,还是Socket有什么命令可以设置!
caomuyong1 2006-10-01
  • 打赏
  • 举报
回复
丢50%有几种可能,一是发的包比较频繁;二是发的包比较大,最好在MTU以下;三是你的代码有问题,呵呵
nuaawenlin 2006-10-01
  • 打赏
  • 举报
回复
如果是一般用户,丢包比较正常的,不过丢50%以上,估计你的代码有问题

如果是专线用户,那就要局方帮你查一下传输设备了
Duwchy 2006-09-30
  • 打赏
  • 举报
回复
UDP传输在公网这样子是不奇怪的,我现在做的一个项目也差不多,要保证传输质量的话就要加入QoS控制,比如使用应答重发机制等等,其实这样就差不多相当于使用TCP协议,呵呵
crazycyber 2006-09-30
  • 打赏
  • 举报
回复
一般会丢10%左右的,不要传大的包
你的业务逻辑不允许丢包的话,还是tcp吧


tcp也只是做qq那样应用时,长链接比较占资源.
DentistryDoctor 2006-09-30
  • 打赏
  • 举报
回复
apr_socket_create?
什么东东?

公网上也不可能丢这么多的?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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