69,369
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include "UDPSession.h"
#include <windows.h>
#include <mmsystem.h>
//#include "time.h"
///////////////////////////////////
//
//////////////////////////////////
UDPSession::UDPSession()
{
sendtime = 0;
arrivetime = 0;
}
UDPSession::~UDPSession()
{
}
/////////////////////////////////////////
//function:
//////////////////////////////////////////
int UDPSession::InitialUDPSession()
{
WSADATA wsaData;
if(NO_ERROR != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
return -1;
}
#if defined SERVER
sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
localAddr.sin_family = AF_INET;
localAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
localAddr.sin_port = htons(5001);
if(SOCKET_ERROR == bind(sockSrv, (sockaddr *)&localAddr, sizeof(sockaddr)))
{
closesocket(sockSrv);
WSACleanup();
return -1;
}
rcv_thread = CreateThread(NULL, 0, ServerReceiveThread, this, 0, NULL);
if(NULL == rcv_thread)
{
closesocket(sockSrv);
WSACleanup();
return -2;
}
#elif defined CLIENT
sockCln = socket(AF_INET, SOCK_DGRAM, 0);
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(5001);
localAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(sockCln, (sockaddr *)&localAddr, sizeof(sockaddr));
remoteAddr.sin_family = AF_INET;
remoteAddr.sin_port = htons(5001);
remoteAddr.sin_addr.S_un.S_addr = inet_addr("144.214.37.244");
rcv_thread = CreateThread(NULL, 0, ClientReceiveThread, this, 0, NULL);
if(NULL == rcv_thread)
{
closesocket(sockCln);
WSACleanup();
return -2;
}
CreateFile();
#endif
return 0;
}
/////////////////////////////////////////////////
//
/////////////////////////////////////////////////
DWORD UDPSession::ServerReceiveThread(LPVOID lpParameter)
{
unsigned int arrivetime;
UDPSession *p = (UDPSession *)lpParameter;
p->fromlen = sizeof(sockaddr);
while(1)
{
recvfrom(p->sockSrv, p->buffer, sizeof(int)*2, 0, (sockaddr *)&(p->remoteAddr), &(p->fromlen));
arrivetime = timeGetTime();
*(unsigned int *)(p->buffer + 4) = arrivetime;
sendto(p->sockSrv, p->buffer, sizeof(int)*2, 0, (sockaddr *)&(p->remoteAddr),p->fromlen);
}
return 1;
}
///////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////
DWORD UDPSession::ClientReceiveThread(LPVOID lpParameter)
{
UDPSession *p = (UDPSession *)lpParameter;
p->fromlen = sizeof(sockaddr);
while(1)
{
recvfrom(p->sockCln, p->buffer, sizeof(int)*2, 0, (sockaddr *)&(p->remoteAddr),&(p->fromlen));
p->arrivetime = timeGetTime();
p->ReceivePacket(p->buffer, p->arrivetime);
}
return 1;
}
void UDPSession::ReceivePacket(char *p, unsigned int t)
{
RTTLog<<*(unsigned int *)p<<' '<<*(unsigned int *)(p + 4)<<' '<<t<<endl;
}
int UDPSession::SessionShutDown()
{
TerminateThread(rcv_thread, 0);
#if defined SERVER
closesocket(sockSrv);
#elif defined CLIENT
closesocket(sockCln);
CloseFile();
#endif
WSACleanup();
return 1;
}
/////////////////////////////////////////
//
/////////////////////////////////////////
void UDPSession::SendRTTPacket()
{
char sendbuf[8];
sendtime = timeGetTime();
*(unsigned int *)(sendbuf) = sendtime;
sendto(sockCln, sendbuf, sizeof(int)*2, 0, (const sockaddr *)&remoteAddr,sizeof(sockaddr));
}
////////////////////////////////////
//
///////////////////////////////////
void UDPSession::CreateFile()
{
RTTLog.open("RTTClient.txt");
}
//////////////////////////////////
//
//////////////////////////////////
void UDPSession::CloseFile()
{
RTTLog.close();
}