• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

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>

変更サマリ

差分

--- a/Net.cpp
+++ b/Net.cpp
@@ -58,8 +58,15 @@ void* SetupTCP( const BOOL& bServer,
5858 tcp.m_bServer = bServer;
5959 tcp.m_bClient = bClient;
6060 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+ }
6370 tcp.m_nBufSize = nBufSize;
6471 tcp.m_nBufAry = nBufAry;
6572 g_CTCP.SetTCP( tcp );
--- a/TCP.cpp
+++ b/TCP.cpp
@@ -43,8 +43,8 @@ unsigned __stdcall CTCP::AcceptThread( void *p )
4343 // 接続元サーバーのアドレス設定
4444 SOCKADDR_IN sa_in;
4545 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() ) );
4848
4949 // 作成したソケットにアドレスとポートを関連付け
5050 if( ::bind( Sock, reinterpret_cast<SOCKADDR*>( &sa_in ), sizeof( SOCKADDR ) ) != 0 )
@@ -83,7 +83,7 @@ unsigned __stdcall CTCP::AcceptThread( void *p )
8383 }
8484
8585 // 接続してきたアドレスが自分自身の場合、終了判定とみなしループ脱出
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 )
8787 {
8888 ::closesocket( Socket );
8989 break;
@@ -125,8 +125,8 @@ unsigned __stdcall CTCP::ConnectThread( void *p )
125125 // 接続先サーバーのアドレス設定
126126 SOCKADDR_IN sa_in;
127127 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() ) );
130130
131131 // CONNECT
132132 int nRes = ::WSAConnect( Sock, reinterpret_cast<SOCKADDR*>( &sa_in ), sizeof( sa_in ), NULL, NULL, NULL, NULL );
@@ -275,8 +275,8 @@ int CTCP::End( void )
275275 // 接続先サーバーのアドレス設定
276276 SOCKADDR_IN sa_in;
277277 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() ) );
280280
281281 // 自分に接続
282282 int nRes = ::WSAConnect( Sock, reinterpret_cast<SOCKADDR*>( &sa_in ), sizeof( sa_in ), NULL, NULL, NULL, NULL );
@@ -294,6 +294,30 @@ int CTCP::End( void )
294294 }
295295
296296 /*******************************************************************************
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+/*******************************************************************************
297321 * @fn void CTCP::Send( BYTE* byData )
298322 * @param[in] byData 送信するデータ
299323 * @retval none なし
--- a/TCP.h
+++ b/TCP.h
@@ -39,10 +39,12 @@ struct STCP
3939 {
4040 STCP()
4141 : m_bServer( FALSE )
42+ , m_sAddr1()
43+ , m_sPort1()
4244 , m_bClient( FALSE )
45+ , m_sAddr2()
46+ , m_sPort2()
4347 , m_nMemMax( 1 )
44- , m_sAddr()
45- , m_sPort()
4648 , m_nBufSize( 0 )
4749 , m_nBufAry( 0 )
4850 {
@@ -50,13 +52,15 @@ struct STCP
5052
5153 // サーバー情報
5254 BOOL m_bServer; //!< TCP/IPサーバー
55+ std::string m_sAddr1; //!< IPアドレス
56+ std::string m_sPort1; //!< ポート番号
5357 // クライアント情報
5458 BOOL m_bClient; //!< TCP/IPクライアント
59+ std::string m_sAddr2; //!< IPアドレス(流用)
60+ std::string m_sPort2; //!< ポート番号(流用)
61+
5562 // その他
5663 int m_nMemMax; //!< 参加人数上限(自分は含まない)
57- std::string m_sAddr; //!< IPアドレス
58- std::string m_sPort; //!< ポート番号
59-
6064 int m_nBufSize; //!< TCP/IP送受信サイズ
6165 int m_nBufAry; //!< m_nBufSize 配列数
6266 };
@@ -77,7 +81,7 @@ public:
7781 private:
7882 static unsigned __stdcall AcceptThread( void *p ); //!< 認証用スレッド
7983 static unsigned __stdcall ConnectThread( void *p ); //!< 接続用スレッド
80-
84+
8185 void Connect( const SOCKET* sock,
8286 const SOCKADDR_IN& out ); //!< ソケット接続
8387
@@ -91,6 +95,9 @@ public:
9195 int Init( CLog *pLog ); //!< 初期化
9296 int End( void ); //!< 終了
9397
98+ int P2PConnect( const char* cAddr,
99+ const char* cPort ); //!< P2P接続
100+
94101 void Send( BYTE* byData ); //!< データの送信
95102 const BYTE* Recv( void ); //!< データの受信
96103
--- a/TestNetLib.cpp
+++ b/TestNetLib.cpp
@@ -55,7 +55,9 @@ BOOL CALLBACK DlgProcInit( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
5555 ::SendDlgItemMessage( hWnd, IDC_IPADDRESS1, IPM_SETADDRESS, 0, lpIP );
5656 ::SetDlgItemText( hWnd, IDC_EDIT1, L"12345" );
5757 ::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" );
5961 }
6062 break;
6163 case WM_COMMAND:
@@ -73,6 +75,7 @@ BOOL CALLBACK DlgProcInit( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
7375 ::GetDlgItemTextA( hWnd, IDC_EDIT1, g_cPort, 256 );
7476 if( ::SendDlgItemMessage( hWnd, IDC_RADIO1, BM_GETCHECK, 0, 0 ) ) g_nTCP = 0;
7577 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;
7679 char cMem[ 256 ];
7780 ::GetDlgItemTextA( hWnd, IDC_EDIT2, cMem, 256 );
7881 g_nMem = ::atoi( cMem );
@@ -193,6 +196,98 @@ BOOL CALLBACK DlgProcTCPCli( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
193196 }
194197
195198 /*******************************************************************************
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+/*******************************************************************************
196291 * @fn int WINAPI WinMain( HINSTANCE hInstance,
197292 * HINSTANCE hPrevInstance,
198293 * LPSTR lpCmdLine,
@@ -217,6 +312,7 @@ int WINAPI WinMain( HINSTANCE hInstance,
217312 {
218313 case 0: g_pTcp = reinterpret_cast<NET::CTCP*>( NET::SetupTCP( TRUE, FALSE, g_nMem, g_cAddr, g_cPort, BUF_SIZE, BUF_ARY ) ); break;
219314 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;
220316 }
221317
222318 // Network の初期化
@@ -226,6 +322,7 @@ int WINAPI WinMain( HINSTANCE hInstance,
226322 {
227323 case 0: ::DialogBox( hInstance, MAKEINTRESOURCE( IDD_TCPSRV ), NULL, reinterpret_cast<DLGPROC>( DlgProcTCPSrv ) ); break;
228324 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;
229326 }
230327
231328 // Network の終了
Binary files a/TestNetLib.rc and b/TestNetLib.rc differ
Binary files a/resource.h and b/resource.h differ