-
Notifications
You must be signed in to change notification settings - Fork 17
/
NetPlay.h
153 lines (124 loc) · 3.47 KB
/
NetPlay.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//
// ネットプレイクラス
//
#ifndef __CNETPLAY_INCLUDED__
#define __CNETPLAY_INCLUDED__
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <mmsystem.h>
#include <winsock.h>
#include "macro.h"
#include "typedef.h"
#include <string>
using namespace std;
#define WM_NETPLAY (WM_APP+100)
#define WM_NETPLAY_HOSTBYNAME (WM_APP+101)
#define WM_NETPLAY_ACCEPT (WM_APP+110)
#define WM_NETPLAY_CONNECT (WM_APP+111)
#define WM_NETPLAY_CLOSE (WM_APP+112)
#define WM_NETPLAY_ERROR (WM_APP+113)
// for BSD style
#ifndef INVALID_SOCKET
#define INVALID_SOCKET -1
#endif
// for Winsock1.x
#ifndef SD_RECEIVE
#define SD_RECEIVE 0
#endif
#ifndef SD_SEND
#define SD_SEND 1
#endif
#ifndef SD_BOTH
#define SD_BOTH 2
#endif
class CNetPlay
{
public:
CNetPlay();
~CNetPlay();
// 初期化/開放
BOOL Initialize( HWND hWnd );
void Release();
// ネットプレイ中?
BOOL IsNetPlay() { return m_hWnd?TRUE:FALSE; }
// 接続中?
BOOL IsConnect() { return m_hWnd?m_bConnect:FALSE; }
// 接続中?
BOOL IsServer() { return m_bServer; }
// 通信レイテンシ
void SetLatency( INT nLatency ) { m_nLatency = nLatency; }
INT GetLatency() { return m_nLatency; }
// 非同期処理メッセージ返送ウインドウの設定
void SetMsgWnd( HWND hWnd ) { m_hWndMsg = hWnd; }
// チャットメッセージ受け取りウインドウの設定
void SetChatWnd( HWND hWnd ) { m_hWndChat = hWnd; }
// ホスト名がIPかどうかをチェックする(0:IP -:Error +:Host search)
INT ASyncHostCheck( HWND hWnd, const char* lpszHost );
HRESULT ASyncWndProc( HWND hWnd, WPARAM wParam, LPARAM lParam );
// 接続と切断
BOOL Connect( BOOL bServer, const char* lpszIP, unsigned short Port );
void Disconnect();
// データ送信 0:受信データ待ち 1以上:受信データあり 0未満:接続切れやエラー
INT Send( BYTE data );
// データ受信
// 0:受信データ待ち 1以上:受信データあり 0未満:接続切れやエラー
// タイムアウト無し
INT Recv( BYTE& data );
// タイムアウト有り
INT RecvTime( BYTE& data, unsigned long timeout );
// リングバッファへの取り込み
BOOL RecvBuffer();
// バッファチェック(0:No change +:frame add -:no frame)
INT BufferCheck();
// リングバッファのバッファリングバイト数取得
INT GetRecvBufferSize();
// 同期処理
INT Sync();
// プレイヤー状態の更新
INT ModifyPlayer( LPBYTE p1, LPBYTE p2 );
// チャットメッセージ送信
void ChatSend( LPCSTR lpStr );
// Windowsメッセージプロシージャ
HRESULT WndProc( HWND hWnd, WPARAM wParam, LPARAM lParam );
// 通信バッファ
enum {
// データブロックサイズ
SOCKET_BLOCK_SIZE = 8,
// バッファサイズ
SOCKET_BUFFER_SIZE = (SOCKET_BLOCK_SIZE*32),
// 受信時バッファサイズ
SOCKET_RECEIVE_SIZE = (SOCKET_BLOCK_SIZE*8)
};
protected:
// メンバ変数
HWND m_hWnd;
HWND m_hWndMsg;
HWND m_hWndASync;
HWND m_hWndChat;
HANDLE m_hASyncTask;
CHAR m_HostEntry[MAXGETHOSTSTRUCT];
BOOL m_bServer;
BOOL m_bConnect; // 接続中?
INT m_nLatency; // レイテンシ(バッファサイズ)
INT m_nFrameStep; // 通信フレームレート
INT m_nFrameCount; // カウンタ
// Ring buffer
INT m_nRingPtr;
INT m_nSendPtr;
INT m_nRecvPtr;
INT m_nRecvSize;
BYTE m_SendBuffer[SOCKET_BUFFER_SIZE];
BYTE m_RecvBuffer[SOCKET_BUFFER_SIZE];
// WINSOCK
WSADATA m_WSAdata;
SOCKET m_SocketConnect;
SOCKET m_SocketData;
SOCKET m_SocketChat;
struct sockaddr_in m_SAddr_Server;
struct sockaddr_in m_SAddr_Client;
private:
};
extern CNetPlay NetPlay;
#endif // !__CNETPLAY_INCLUDED__