Udp传输慢的问题
看下面代码,在本地传输很快,放到公网上,测试要掉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");
}