TCP/UDP通信プログラムのライブラリ
リビジョン | 36a55fcb7078d9126b5d784d8d2cdb682d898774 (tree) |
---|---|
日時 | 2012-02-18 15:34:36 |
作者 | ohwhsmm7 <ohwhsmm7@gmai...> |
コミッター | ohwhsmm7 |
Net_007 ・・・ TCP/IPのP2P接続機能の追加
Signed-off-by: ohwhsmm7 <ohwhsmm7@gmail.com>
@@ -58,8 +58,15 @@ void* SetupTCP( const BOOL& bServer, | ||
58 | 58 | tcp.m_bServer = bServer; |
59 | 59 | tcp.m_bClient = bClient; |
60 | 60 | tcp.m_nMemMax = nMember; |
61 | - tcp.m_sAddr = cAddr; | |
62 | - tcp.m_sPort = cPort; | |
61 | + if( tcp.m_bServer ) | |
62 | + { | |
63 | + tcp.m_sAddr1 = cAddr; | |
64 | + tcp.m_sPort1 = cPort; | |
65 | + }else | |
66 | + { | |
67 | + tcp.m_sAddr2 = cAddr; | |
68 | + tcp.m_sPort2 = cPort; | |
69 | + } | |
63 | 70 | tcp.m_nBufSize = nBufSize; |
64 | 71 | tcp.m_nBufAry = nBufAry; |
65 | 72 | g_CTCP.SetTCP( tcp ); |
@@ -43,8 +43,8 @@ unsigned __stdcall CTCP::AcceptThread( void *p ) | ||
43 | 43 | // 接続元サーバーのアドレス設定 |
44 | 44 | SOCKADDR_IN sa_in; |
45 | 45 | sa_in.sin_family = AF_INET; |
46 | - sa_in.sin_addr.S_un.S_addr = ::inet_addr( pTCP->m_STcp.m_sAddr.c_str() ); | |
47 | - sa_in.sin_port = ::htons( ::atoi( pTCP->m_STcp.m_sPort.c_str() ) ); | |
46 | + sa_in.sin_addr.S_un.S_addr = ::inet_addr( pTCP->m_STcp.m_sAddr1.c_str() ); | |
47 | + sa_in.sin_port = ::htons( ::atoi( pTCP->m_STcp.m_sPort1.c_str() ) ); | |
48 | 48 | |
49 | 49 | // 作成したソケットにアドレスとポートを関連付け |
50 | 50 | if( ::bind( Sock, reinterpret_cast<SOCKADDR*>( &sa_in ), sizeof( SOCKADDR ) ) != 0 ) |
@@ -83,7 +83,7 @@ unsigned __stdcall CTCP::AcceptThread( void *p ) | ||
83 | 83 | } |
84 | 84 | |
85 | 85 | // 接続してきたアドレスが自分自身の場合、終了判定とみなしループ脱出 |
86 | - if( ::strcmp( pTCP->m_STcp.m_sAddr.c_str(), ::inet_ntoa( sa_out.sin_addr ) ) == 0 ) | |
86 | + if( ::strcmp( pTCP->m_STcp.m_sAddr1.c_str(), ::inet_ntoa( sa_out.sin_addr ) ) == 0 ) | |
87 | 87 | { |
88 | 88 | ::closesocket( Socket ); |
89 | 89 | break; |
@@ -125,8 +125,8 @@ unsigned __stdcall CTCP::ConnectThread( void *p ) | ||
125 | 125 | // 接続先サーバーのアドレス設定 |
126 | 126 | SOCKADDR_IN sa_in; |
127 | 127 | sa_in.sin_family = AF_INET; |
128 | - sa_in.sin_addr.S_un.S_addr = ::inet_addr( pTCP->m_STcp.m_sAddr.c_str() ); | |
129 | - sa_in.sin_port = ::htons( ::atoi( pTCP->m_STcp.m_sPort.c_str() ) ); | |
128 | + sa_in.sin_addr.S_un.S_addr = ::inet_addr( pTCP->m_STcp.m_sAddr2.c_str() ); | |
129 | + sa_in.sin_port = ::htons( ::atoi( pTCP->m_STcp.m_sPort2.c_str() ) ); | |
130 | 130 | |
131 | 131 | // CONNECT |
132 | 132 | int nRes = ::WSAConnect( Sock, reinterpret_cast<SOCKADDR*>( &sa_in ), sizeof( sa_in ), NULL, NULL, NULL, NULL ); |
@@ -275,8 +275,8 @@ int CTCP::End( void ) | ||
275 | 275 | // 接続先サーバーのアドレス設定 |
276 | 276 | SOCKADDR_IN sa_in; |
277 | 277 | sa_in.sin_family = AF_INET; |
278 | - sa_in.sin_addr.S_un.S_addr = ::inet_addr( m_STcp.m_sAddr.c_str() ); | |
279 | - sa_in.sin_port = ::htons( ::atoi( m_STcp.m_sPort.c_str() ) ); | |
278 | + sa_in.sin_addr.S_un.S_addr = ::inet_addr( m_STcp.m_sAddr1.c_str() ); | |
279 | + sa_in.sin_port = ::htons( ::atoi( m_STcp.m_sPort1.c_str() ) ); | |
280 | 280 | |
281 | 281 | // 自分に接続 |
282 | 282 | int nRes = ::WSAConnect( Sock, reinterpret_cast<SOCKADDR*>( &sa_in ), sizeof( sa_in ), NULL, NULL, NULL, NULL ); |
@@ -294,6 +294,30 @@ int CTCP::End( void ) | ||
294 | 294 | } |
295 | 295 | |
296 | 296 | /******************************************************************************* |
297 | + * @fn int CTCP::P2PConnect( const char* cAddr, | |
298 | + * const char* cPort ) | |
299 | + * @param[in] cAddr TCP/IP サーバーのIPアドレス | |
300 | + * @param[in] cPort TCP/IP サーバーのポート番号 | |
301 | + * @retval int TRUE=OK/FALSE=NG | |
302 | + * @brief P2P接続 | |
303 | + ******************************************************************************/ | |
304 | +int CTCP::P2PConnect( const char* cAddr, | |
305 | + const char* cPort ) | |
306 | +{ | |
307 | + unsigned int uiID; | |
308 | + HANDLE hID; | |
309 | + | |
310 | + m_STcp.m_sAddr2 = cAddr; | |
311 | + m_STcp.m_sPort2 = cPort; | |
312 | + | |
313 | + m_pLog->SetLog( "NET::TCP TCP/IP P2P接続" ); | |
314 | + hID = reinterpret_cast<HANDLE>( ::_beginthreadex( NULL, 0, &CTCP::ConnectThread, this, 0, &uiID ) ); | |
315 | + ::CloseHandle( hID ); | |
316 | + | |
317 | + return TRUE; | |
318 | +} | |
319 | + | |
320 | +/******************************************************************************* | |
297 | 321 | * @fn void CTCP::Send( BYTE* byData ) |
298 | 322 | * @param[in] byData 送信するデータ |
299 | 323 | * @retval none なし |
@@ -39,10 +39,12 @@ struct STCP | ||
39 | 39 | { |
40 | 40 | STCP() |
41 | 41 | : m_bServer( FALSE ) |
42 | + , m_sAddr1() | |
43 | + , m_sPort1() | |
42 | 44 | , m_bClient( FALSE ) |
45 | + , m_sAddr2() | |
46 | + , m_sPort2() | |
43 | 47 | , m_nMemMax( 1 ) |
44 | - , m_sAddr() | |
45 | - , m_sPort() | |
46 | 48 | , m_nBufSize( 0 ) |
47 | 49 | , m_nBufAry( 0 ) |
48 | 50 | { |
@@ -50,13 +52,15 @@ struct STCP | ||
50 | 52 | |
51 | 53 | // サーバー情報 |
52 | 54 | BOOL m_bServer; //!< TCP/IPサーバー |
55 | + std::string m_sAddr1; //!< IPアドレス | |
56 | + std::string m_sPort1; //!< ポート番号 | |
53 | 57 | // クライアント情報 |
54 | 58 | BOOL m_bClient; //!< TCP/IPクライアント |
59 | + std::string m_sAddr2; //!< IPアドレス(流用) | |
60 | + std::string m_sPort2; //!< ポート番号(流用) | |
61 | + | |
55 | 62 | // その他 |
56 | 63 | int m_nMemMax; //!< 参加人数上限(自分は含まない) |
57 | - std::string m_sAddr; //!< IPアドレス | |
58 | - std::string m_sPort; //!< ポート番号 | |
59 | - | |
60 | 64 | int m_nBufSize; //!< TCP/IP送受信サイズ |
61 | 65 | int m_nBufAry; //!< m_nBufSize 配列数 |
62 | 66 | }; |
@@ -77,7 +81,7 @@ public: | ||
77 | 81 | private: |
78 | 82 | static unsigned __stdcall AcceptThread( void *p ); //!< 認証用スレッド |
79 | 83 | static unsigned __stdcall ConnectThread( void *p ); //!< 接続用スレッド |
80 | - | |
84 | + | |
81 | 85 | void Connect( const SOCKET* sock, |
82 | 86 | const SOCKADDR_IN& out ); //!< ソケット接続 |
83 | 87 |
@@ -91,6 +95,9 @@ public: | ||
91 | 95 | int Init( CLog *pLog ); //!< 初期化 |
92 | 96 | int End( void ); //!< 終了 |
93 | 97 | |
98 | + int P2PConnect( const char* cAddr, | |
99 | + const char* cPort ); //!< P2P接続 | |
100 | + | |
94 | 101 | void Send( BYTE* byData ); //!< データの送信 |
95 | 102 | const BYTE* Recv( void ); //!< データの受信 |
96 | 103 |
@@ -55,7 +55,9 @@ BOOL CALLBACK DlgProcInit( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) | ||
55 | 55 | ::SendDlgItemMessage( hWnd, IDC_IPADDRESS1, IPM_SETADDRESS, 0, lpIP ); |
56 | 56 | ::SetDlgItemText( hWnd, IDC_EDIT1, L"12345" ); |
57 | 57 | ::SendDlgItemMessage( hWnd, IDC_RADIO1, BM_SETCHECK, BST_CHECKED, 0 ); |
58 | - ::SetDlgItemText( hWnd, IDC_EDIT2, L"1" ); | |
58 | + ::SetDlgItemText( hWnd, IDC_EDIT2, L"5" ); | |
59 | + ::SendDlgItemMessage( hWnd, IDC_IPADDRESS2, IPM_SETADDRESS, 0, lpIP ); | |
60 | + ::SetDlgItemText( hWnd, IDC_EDIT4, L"12345" ); | |
59 | 61 | } |
60 | 62 | break; |
61 | 63 | case WM_COMMAND: |
@@ -73,6 +75,7 @@ BOOL CALLBACK DlgProcInit( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) | ||
73 | 75 | ::GetDlgItemTextA( hWnd, IDC_EDIT1, g_cPort, 256 ); |
74 | 76 | if( ::SendDlgItemMessage( hWnd, IDC_RADIO1, BM_GETCHECK, 0, 0 ) ) g_nTCP = 0; |
75 | 77 | if( ::SendDlgItemMessage( hWnd, IDC_RADIO2, BM_GETCHECK, 0, 0 ) ) g_nTCP = 1; |
78 | + if( ::SendDlgItemMessage( hWnd, IDC_RADIO3, BM_GETCHECK, 0, 0 ) ) g_nTCP = 2; | |
76 | 79 | char cMem[ 256 ]; |
77 | 80 | ::GetDlgItemTextA( hWnd, IDC_EDIT2, cMem, 256 ); |
78 | 81 | g_nMem = ::atoi( cMem ); |
@@ -193,6 +196,98 @@ BOOL CALLBACK DlgProcTCPCli( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam | ||
193 | 196 | } |
194 | 197 | |
195 | 198 | /******************************************************************************* |
199 | + * @fn BOOL CALLBACK DlgProcTCPP2P( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) | |
200 | + * @retval LRESULT | |
201 | + * @brief TCP/IPP2P用ダイアログプロシージャ | |
202 | + ******************************************************************************/ | |
203 | +BOOL CALLBACK DlgProcTCPP2P( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) | |
204 | +{ | |
205 | + if( g_nTCPDlg ) | |
206 | + { | |
207 | + // ログ取得 | |
208 | + int nCnt = NET::GetLogCnt(); | |
209 | + if( nCnt > g_nTCPLogCnt ) | |
210 | + { | |
211 | + std::string str = NET::GetLog( g_nTCPLogCnt ); | |
212 | + char cBuf[ 256 ]; | |
213 | + ::sprintf_s( cBuf, 256, "%s\n", str.c_str() ); | |
214 | + ::SendDlgItemMessageA( hWnd, IDC_LIST1, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>( cBuf ) ); | |
215 | + g_nTCPLogCnt++; | |
216 | + } | |
217 | + // データ受信 | |
218 | + { | |
219 | + const BYTE* byData = g_pTcp->Recv(); | |
220 | + if( byData != NULL ) | |
221 | + { | |
222 | + char cBuf[ BUF_SIZE ]; | |
223 | + ::memcpy_s( cBuf, BUF_SIZE, byData, BUF_SIZE ); | |
224 | + ::SendDlgItemMessageA( hWnd, IDC_LIST1, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>( cBuf ) ); | |
225 | + | |
226 | + // 新規P2Pサーバー | |
227 | + if( ::strncmp( cBuf, "P2PSERVER:", 10 ) == 0 ) | |
228 | + { | |
229 | + char *cTmp = NULL, *cAddr = NULL, *cPort = NULL, *cNext = NULL; | |
230 | + cTmp = ::strtok_s( cBuf, ":", &cNext ); | |
231 | + cAddr = ::strtok_s( NULL, ":", &cNext ); | |
232 | + cPort = ::strtok_s( NULL, "\0", &cNext ); | |
233 | + | |
234 | + char cBuf[ BUF_SIZE ]; | |
235 | + ::sprintf_s( cBuf, "NEWSERVER:%s:%s", cAddr, cPort ); | |
236 | + // データ送信 | |
237 | + g_pTcp->Send( reinterpret_cast<BYTE*>( cBuf ) ); | |
238 | + } | |
239 | + if( ::strncmp( cBuf, "NEWSERVER:", 10 ) == 0 ) | |
240 | + { | |
241 | + char *cTmp = NULL, *cAddr = NULL, *cPort = NULL, *cNext = NULL; | |
242 | + cTmp = ::strtok_s( cBuf, ":", &cNext ); | |
243 | + cAddr = ::strtok_s( NULL, ":", &cNext ); | |
244 | + cPort = ::strtok_s( NULL, "\0", &cNext ); | |
245 | + // 自分以外 | |
246 | + if( ( ::strcmp( g_cAddr, cAddr ) != 0 ) || ( ::strcmp( g_cPort, cPort ) != 0 ) ) | |
247 | + g_pTcp->P2PConnect( cAddr, cPort ); | |
248 | + } | |
249 | + } | |
250 | + } | |
251 | + } | |
252 | + | |
253 | + switch( uMsg ) | |
254 | + { | |
255 | + case WM_INITDIALOG: | |
256 | + g_nTCPDlg = 1; | |
257 | + break; | |
258 | + case WM_COMMAND: | |
259 | + switch( LOWORD( wParam ) ) | |
260 | + { | |
261 | + case IDC_BUTTON2: | |
262 | + { | |
263 | + char cBuf[ BUF_SIZE ]; | |
264 | + ::GetDlgItemTextA( hWnd, IDC_EDIT3, cBuf, BUF_SIZE ); | |
265 | + | |
266 | + // 新規接続 | |
267 | + if( ::strncmp( cBuf, "NEWCONNECT:", 11 ) == 0 ) | |
268 | + { | |
269 | + char *cTmp = NULL, *cAddr = NULL, *cPort = NULL, *cNext = NULL; | |
270 | + cTmp = ::strtok_s( cBuf, ":", &cNext ); | |
271 | + cAddr = ::strtok_s( NULL, ":", &cNext ); | |
272 | + cPort = ::strtok_s( NULL, "\0", &cNext ); | |
273 | + | |
274 | + g_pTcp->P2PConnect( cAddr, cPort ); | |
275 | + }else | |
276 | + // データ送信 | |
277 | + g_pTcp->Send( reinterpret_cast<BYTE*>( cBuf ) ); | |
278 | + } | |
279 | + break; | |
280 | + } | |
281 | + break; | |
282 | + case WM_CLOSE: | |
283 | + case WM_DESTROY: | |
284 | + ::EndDialog( hWnd, FALSE ); | |
285 | + return TRUE; | |
286 | + } | |
287 | + return FALSE; | |
288 | +} | |
289 | + | |
290 | +/******************************************************************************* | |
196 | 291 | * @fn int WINAPI WinMain( HINSTANCE hInstance, |
197 | 292 | * HINSTANCE hPrevInstance, |
198 | 293 | * LPSTR lpCmdLine, |
@@ -217,6 +312,7 @@ int WINAPI WinMain( HINSTANCE hInstance, | ||
217 | 312 | { |
218 | 313 | case 0: g_pTcp = reinterpret_cast<NET::CTCP*>( NET::SetupTCP( TRUE, FALSE, g_nMem, g_cAddr, g_cPort, BUF_SIZE, BUF_ARY ) ); break; |
219 | 314 | case 1: g_pTcp = reinterpret_cast<NET::CTCP*>( NET::SetupTCP( FALSE, TRUE, g_nMem, g_cAddr, g_cPort, BUF_SIZE, BUF_ARY ) ); break; |
315 | + case 2: g_pTcp = reinterpret_cast<NET::CTCP*>( NET::SetupTCP( TRUE, FALSE, g_nMem, g_cAddr, g_cPort, BUF_SIZE, BUF_ARY ) ); break; | |
220 | 316 | } |
221 | 317 | |
222 | 318 | // Network の初期化 |
@@ -226,6 +322,7 @@ int WINAPI WinMain( HINSTANCE hInstance, | ||
226 | 322 | { |
227 | 323 | case 0: ::DialogBox( hInstance, MAKEINTRESOURCE( IDD_TCPSRV ), NULL, reinterpret_cast<DLGPROC>( DlgProcTCPSrv ) ); break; |
228 | 324 | case 1: ::DialogBox( hInstance, MAKEINTRESOURCE( IDD_TCPCLI ), NULL, reinterpret_cast<DLGPROC>( DlgProcTCPCli ) ); break; |
325 | + case 2: ::DialogBox( hInstance, MAKEINTRESOURCE( IDD_TCPCLI ), NULL, reinterpret_cast<DLGPROC>( DlgProcTCPP2P ) ); break; | |
229 | 326 | } |
230 | 327 | |
231 | 328 | // Network の終了 |