/*******************************************************************
* Advanced 3D Game Programming using DirectX 9.0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* copyright (c) 2003 by Peter A Walsh and Adrian Perez
* See license.txt for modification and distribution information
******************************************************************/
// MTUDP.cpp: implementation of the MTUDP class.
//
//////////////////////////////////////////////////////////////////////
#include "MTUDP.h"
#include "cNetError.h"
#include "Macros.h"
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
enum eMTUDPMsgType
{
MTUDPMSGTYPE_ACKS = 0,
MTUDPMSGTYPE_RELIABLE = 1,
MTUDPMSGTYPE_UNRELIABLE = 2,
MTUDPMSGTYPE_CLOCK = 3,
MTUDPMSGTYPE_NUMMESSAGES = 4,
};
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MTUDP::MTUDP()
{
d_bRunning = false;
d_bSending = false;
d_bListening = false;
d_bIsClientOn = false;
d_bIsServerOn = false;
d_listenSocket = 0;
d_sendSocket = 0;
d_bytesTransfered = 0;
}
MTUDP::~MTUDP()
{
StopListening();
StopSending();
Cleanup();
}
void MTUDP::Startup( unsigned short localListenPort, unsigned short foreignListenPort )
{
Cleanup();
// Start Winsock
OutputDebugString( "MTUDP::Startup() - Initializing Winsock.\n" );
WSAData wsaData;
int error;
error = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if( error == SOCKET_ERROR )
{
char errorBuffer[ 100 ];
error = WSAGetLastError();
if( error == WSAVERNOTSUPPORTED )
{
sprintf( errorBuffer, "MTUDP::Startup() - WSAStartup() error.\nRequested v2.2, found only v%d.%d.",
LOBYTE( wsaData.wVersion ),
HIBYTE( wsaData.wVersion ) );
WSACleanup();
}
else
sprintf( errorBuffer, "MTUDP::Startup() - WSAStartup() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
d_localListenPort = localListenPort;
d_foreignListenPort = foreignListenPort;
d_bytesTransfered = 0;
d_bRunning = true;
}
void MTUDP::StartListening()
{
if( d_bListening == true ||
d_bRunning == false )
return;
d_bListening = true;
// Start the listen socket.
OutputDebugString( "MTUPD::StartListening() - Creating the listen socket.\n" );
d_listenSocket = socket( AF_INET, SOCK_DGRAM, 0 );
if( d_listenSocket == INVALID_SOCKET )
{
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUPD::StartListening() - socket() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
SOCKADDR_IN localAddr;
int result;
memset( &localAddr, 0, sizeof( SOCKADDR_IN ) );
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl( INADDR_ANY );
localAddr.sin_port = htons( d_localListenPort );
result = bind( d_listenSocket, (sockaddr *)&localAddr, sizeof( SOCKADDR_IN ) );
if( result == SOCKET_ERROR )
{
closesocket( d_listenSocket );
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUPD::StartListening() - bind() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
unsigned long int val;
val = 1; // Anything non-zero.
result = ioctlsocket( d_listenSocket, FIONBIO, &val );
if( result )
{
closesocket( d_listenSocket );
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUPD::StartListening() - ioctlsocket() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
// Start the thread.
OutputDebugString( "MTUPD::StartListening() - Starting the listen thread.\n" );
cThread::Begin();
}
void MTUDP::StartSending()
{
if( d_bSending == true ||
d_bRunning == false )
return;
d_bSending = true;
// Create send socket
OutputDebugString( "MTUPD::StartSending() - Creating the send socket.\n" );
d_sendSocket = socket( AF_INET, SOCK_DGRAM, 0 );
if( d_sendSocket == INVALID_SOCKET )
{
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUPD::StartSending() - socket() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
SOCKADDR_IN localAddr;
int result;
memset( &localAddr, 0, sizeof( SOCKADDR_IN ) );
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl( INADDR_ANY );
localAddr.sin_port = htons( 0 );
result = bind( d_sendSocket, (sockaddr *)&localAddr, sizeof( SOCKADDR_IN ) );
if( result == SOCKET_ERROR )
{
closesocket( d_sendSocket );
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUPD::StartSending() - bind() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
unsigned long int val;
val = 1; // Anything non-zero.
result = ioctlsocket( d_sendSocket, FIONBIO, &val );
if( result )
{
closesocket( d_sendSocket );
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUPD::StartSending() - ioctlsocket() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
}
void MTUDP::StopListening()
{
if( d_bListening == false )
return;
d_bListening = false;
cThread::End();
OutputDebugString( "MTUPD::StopListening() - Closing the listen socket.\n" );
closesocket( d_listenSocket );
}
void MTUDP::StopSending()
{
if( d_bSending == false )
return;
d_bSending = false;
OutputDebugString( "MTUPD::StopSending() - Closing the send socket.\n" );
closesocket( d_sendSocket );
}
void MTUDP::Cleanup()
{
if( d_bRunning == false )
return;
d_bRunning = false;
StopListening();
StopSending();
OutputDebugString( "MTUPD::Cleanup() - Cleaning up Winsock.\n" );
d_hosts.clear();
d_hostMap.clear();
WSACleanup();
}
////////////////////////////////////////////////////////////////////////////////
void MTUDP::StartClient()
{
d_bIsClientOn = true;
}
void MTUDP::StopClient()
{
d_bIsClientOn = false;
}
void MTUDP::StartServer()
{
d_bIsServerOn = true;
}
void MTUDP::StopServer()
{
d_bIsServerOn = false;
}
////////////////////////////////////////////////////////////////////////////////
DWORD MTUDP::ThreadProc()
{
if( d_bListening == false )
return 0; // Quit already?!
char inBuffer[ MAX_UDPBUFFERSIZE ];
timeval waitTimeStr;
SOCKADDR_IN fromAddr;
int fromLen;
unsigned short result;
FD_SET set;
#if defined( _DEBUG )
memset( inBuffer, 0xFF, MAX_UDPBUFFERSIZE );
#endif
OutputDebugString( "MTUDP::ThreadProc() - Listening thread started.\n" );
try
{
while( d_bListening == true )
{
// Listen to see if there is data waiting to be read.
FD_ZERO( &set );
FD_SET( d_listenSocket, &set );
waitTimeStr.tv_sec = 0;
waitTimeStr.tv_usec = 0;
// Select tells us if there is data to be read.
result = select( FD_SETSIZE, &set, NULL, NULL, &waitTimeStr );
if( result == 0 )
{
Sleep( 10 );
continue;
}
if( result == SOCKET_ERROR )
{
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUDP::ThreadProc() - select() error %d", WSAGetLastError() );
throw cNetError( errorBuffer );
}
// Recvfrom gets the data and puts it in inBuffer.
fromLen = sizeof( SOCKADDR );
result = recvfrom( d_listenSocket, inBuffer, MAX_UDPBUFFERSIZE, 0, (SOCKADDR *)&fromAddr, &fromLen );
if( result == 0 )
{
Sleep( 10 );
continue;
}
if( result == SOCKET_ERROR )
{
char errorBuffer[ 100 ];
sprintf( errorBuffer, "MTUDP::ThreadProc() - recvfrom() error %d", WSAGetLastError() );
没有合适的资源?快使用搜索试试~ 我知道了~
Directx9.0 3D游戏开发编程基础
共1312个文件
h:482个
cpp:370个
dsp:62个
需积分: 9 171 下载量 39 浏览量
2009-04-19
07:47:59
上传
评论
收藏 8.1MB ZIP 举报
温馨提示
第1章 初始化Direct3D 第2章 绘制流水线 第3章 Direct3D中的绘制 第4章 颜色 第5章 光照 第6章 纹理映射 第7章 融合技术 第8章 模板 第9章 字体 第10章 网格(一) 第11章 网格(二) 第12章 设计一个灵活的Camera类 第13章 地形绘制基础 第14章 粒子系统 第15章 拾取 第16章 高级着色语言(HLSL)入门 第17章 顶点着色器入门 第18章 像素着色器入门 第19章 效果框架
资源推荐
资源详情
资源评论
收起资源包目录
Directx9.0 3D游戏开发编程基础 (1312个子文件)
GameServer2.aps 32KB
GameServer2.aps 32KB
potentialFunc.aps 6KB
potentialFunc.aps 6KB
PathPlan.aps 5KB
PathPlan.aps 5KB
Teapot.aps 4KB
Teapot.aps 4KB
fullscreen.bat 18B
fullscreen.bat 18B
Teapot.bez 6KB
Teapot.bez 6KB
SAMPLE.BEZ 220B
SAMPLE.BEZ 220B
MTUDP.CPP 29KB
MTUDP.CPP 29KB
MTUDP.CPP 29KB
MTUDP.CPP 29KB
MULTITEX.CPP 22KB
MULTITEX.CPP 22KB
Game.cpp 21KB
Game.cpp 21KB
GameCell.cpp 14KB
GameCell.cpp 14KB
SubDivSurf.cpp 13KB
SubDivSurf.cpp 13KB
GameWorld.cpp 11KB
GameWorld.cpp 11KB
EntNM.cpp 10KB
EntNM.cpp 10KB
CELL.CPP 10KB
CELL.CPP 10KB
potentialFunc.cpp 10KB
potentialFunc.cpp 10KB
DETAIL.CPP 10KB
DETAIL.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
WAVREAD.CPP 10KB
GraphicsLayer.cpp 9KB
GraphicsLayer.cpp 9KB
GraphicsLayer.cpp 9KB
GraphicsLayer.cpp 9KB
GraphicsLayer.cpp 9KB
GraphicsLayer.cpp 9KB
GraphicsLayer.cpp 9KB
GraphicsLayer.cpp 9KB
GameEnt.cpp 9KB
GameEnt.cpp 9KB
BEZIER.CPP 9KB
BEZIER.CPP 9KB
GameServer.cpp 9KB
GameServer.cpp 9KB
RadiosityCalc.cpp 9KB
RadiosityCalc.cpp 9KB
cHost.cpp 9KB
cHost.cpp 9KB
cHost.cpp 8KB
cHost.cpp 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
MATRIX4.CPP 8KB
neuralNet.cpp 8KB
neuralNet.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
BspTree.cpp 8KB
invKim.cpp 8KB
invKim.cpp 8KB
PathPlan.cpp 8KB
PathPlan.cpp 8KB
SubDiv.cpp 7KB
SubDiv.cpp 7KB
共 1312 条
- 1
- 2
- 3
- 4
- 5
- 6
- 14
资源评论
b3533775
- 粉丝: 2
- 资源: 42
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功