void Client::send( const SERVERDATA& data ) { if ( _tcp_handle < 0 ) { return; } NetWorkSend( _tcp_handle, &data, sizeof( SERVERDATA ) ); }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { IPDATA ipAddress; // 接続用IPアドレスデータ int netHandle; // ネットワークハンドル // データバッファ char strBuf[BufSize] = { 0 }; ChangeWindowMode(TRUE); if (DxLib_Init() == -1) { return -1; } // DXライブラリの通信は独自のプロトコルが混じってるらしいので、FALSEでやめさせる // この場合、通信関連の関数の動作がかなり変化するので気をつけること // 参考:http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=736&p=2 SetUseDXNetWorkProtocol(FALSE); // サーバ名からIPアドレスを取得 GetHostIPbyName(serverName, &ipAddress); // 通信を確立 netHandle = ConnectNetWork(ipAddress, Port); // 確立が成功した場合のみ中の処理をする if (netHandle != -1) { int sendLength = 0; int readLength = 0; int isDataReadable; int requireLength = 4; // データ送信 sprintf_s(strBuf, BufSize, "GET %s HTTP/1.0\nHost: %s\n\n", url, serverName); sendLength = strnlen_s(strBuf, BufSize); NetWorkSend(netHandle, strBuf, sendLength + 1); // 受信したデータをファイルに書き出す std::ofstream ofs("output.txt", std::ios::trunc); int loopCount = 0; int successCount = 0; // データが読み終わるまで待機 while (!ProcessMessage()) { // 一定のループ回数に達したら強制終了 if (loopCount++ >= 10000) break; // 取得していない受信データがあるかチェック isDataReadable = GetNetWorkDataLength(netHandle); // 取得してない受信データ量がない場合はループを抜ける if (isDataReadable == FALSE) break; // データ受信し、読み込んだ分をサイズに増やす readLength = NetWorkRecv(netHandle, strBuf, requireLength); // 読み取りエラー // 待機時の他にバッファ内に溜まっている文字数よりも requireLength が大きい時も -1 になるので注意 if (readLength == -1) { if (--successCount <= -updateCount) { if (--requireLength == 0) requireLength = 1; successCount = 0; // バッファに溜まるように適当に待機 WaitTimer(1000); } continue; } // 規定回数読み取りが成功したら読み取り文字数を増やす if (++successCount >= updateCount) { ++requireLength; successCount = 0; } // 末端文字を付加 strBuf[readLength] = '\0'; // 受信したデータをファイルに出力 ofs << strBuf; printfDx("%d: %s\n", loopCount, strBuf); ScreenFlip(); ClearDrawScreen(); } // 接続を断つ CloseNetWork(netHandle); ofs.flush(); ofs.close(); // キー入力待ち printfDx("\nPlease Push Any Key..."); WaitKey(); } DxLib_End(); return 0; }