• ベストアンサー

演算子「 | 」について

VC++のネットワークプログラミングの勉強をしています。 HTTPクライアントのソースコードをみていると、 こんなの DWORD dwHttpRequestFlags = INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT; とか psf = is.OpenURL( szFile, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD); と書かれているのをよく見るのですが、この場合の「 | 」演算子はどういう意味なのでしょうか? 普通に論理和のことなのでしょうか? その場合はINTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECTとかはどういう意味を持つ値になるのでしょうか? また、このような書き方をするとどのようなメリットがあるのでしょうか? ご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

>普通に論理和のことなのでしょうか? その通りです。 >その場合はINTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECTとかはどういう意味を持つ値になるのでしょうか? 例えば、 #define INTERNET_FLAG_EXISTING_CONNECT 0x1 #define INTERNET_FLAG_NO_AUTO_REDIRECT 0x2 とした場合 0x1(00000001) と 0x2(00000010) との論理和の結果 0x3(00000011)となります。 ビット毎に意味を持たせることによって、通常なら8個の変数が必要な ところを1バイトですませる事ができます。

minimax2005
質問者

お礼

回答ありがとうございます。 ビットごとにフラグを割り振っていたんですね。 論理和にこんな使い道があるなんて気づきませんでした。 変数を減らせるのは結構便利ですね。

その他の回答 (1)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

論理和です。 INTERNET(略)は定数で、(例えば、)1,2,4,8……と値が割り振られています。 その論理和をとることで、どのフラグが立っているかをひとつの引数で受け取ることが出来ます。

minimax2005
質問者

お礼

回答ありがとうございます。 ビットごとにフラグを割り振っていたんですね。 論理和にこんな使い道があるなんて気づきませんでした。

関連するQ&A

  • ファイルを一括ダウンロードするプログラムの作成方法

    いつもお世話になっています。 競艇オフィシャルWeb(ttp://www.kyotei.or.jp/)のダウンロードサービス(ttp://www1.mbrace.or.jp/od2/K/dindex.html)から、競艇成績の1か月分の成績データを一括でダウンロードするプログラムを作成したいと思い、下記ソースを作成しましたが、動作しませんでした。 psf = is.OpenURL()の行で、エラー判定となり、ダウンロードが実行されません。第一引数に"****://www1.mbrace.or.jp/od2/K/k041124.lzh"を渡しており、これが正しくないのだろうとは思うのですが、正しいパスが調べれないでいます。ご存知の方がおられましたら、教えてください。よろしくお願いします。 UINT GetDownloadFile( LPVOID pParam) { CData* pdata = (CData*)pParam; char buf[READ_BYTE_SIZE]; CInternetSession is; CStdioFile *psf; CString szFile; DWORD time1, time2; int readbyte; szFile = pdata->m_sFile; try { psf = is.OpenURL( szFile, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD); pdata->m_nSize = psf->SeekToEnd(); // ファイルサイズの取得. psf->SeekToBegin();// ポインタを先頭に戻す //中略 psf->Close(); file.Close(); delete psf; } catch( CInternetException *IE) // エラー処理. { pdata->m_dwError = IE->m_dwError; pdata->m_bError = TRUE; IE->Delete(); } pdata->m_pWnd->SendMessage( WM_DL_END); return 1; }

  • No route to hostの対処方法

    Red Hat Linux9.0同士のサーバ間でFTPを使って 一連の処理を考えております。 FTPコマンドを打っているときに、以下のような No route to hostのエラーが出てきます。 ---------------------------------------------------- $ ftp ftp.xxx.com Connected to ftp.xxx.com (203.135.XXX.XXX). 220 (vsFTPd 1.1.3) Name (ftp.xxx.com:admin): admin 331 Please specify the password. Password: 230 Login successful. Have fun. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,0,224,74,195) ftp: connect: No route to host ftp> ---------------------------------------------------- 内容を調べると、「リモートホストまでのルーティング テーブルがないため接続できません。」という意味。 ログインはできているのですが、そこから先が エラーとなって進めない状況です。 ちなみに、サーバにはファイアウォールは使用していません。 この対処法についてアドバイスをお願いします。

  • WinInetのInternetOpenUrl関数が正常に動作しない。

    ネットワーク上のHTMLソースを取得しようとしています。InternetOpenUrl関数が動作せず、常にNULLが返ってきます。 環境は、WindowsXP、WindowsCE Platform Builder です。 void Get_HTML(){ HINTERNET hInternet; HINTERNET hFile; char Buff[1000]; DWORD ReadSize; BOOL bResult; //WinInetの初期化 char *agent ="WININET Sample Program"; hInternet = InternetOpen( (LPCWSTR)agent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 ); if( hInternet == NULL ){ printf("InternetOpen Error \n"); } //ネット接続チェック if( InternetAttemptConnect(0) != ERROR_SUCCESS { printf("インターネットに接続できません。\n"); } else{ printf("インターネットに接続できる\n"); } //URLオープン char open_url="http://www.sample.com/sam1.html"; hFile = InternetOpenUrl( hInternet, (LPCWSTR)open_url, NULL, 0, INTERNET_FLAG_RELOAD, 0 ); printf("%s",(LPCWSTR)open_url); if( hFile == NULL ){ printf(" InternetOpenUrl ERROR \n"); } } InternetOpenUrl関数の戻り値がNULLになりReadを することが出来ません。 解決方法よろしくお願い致します。

  • wininetでPOSTで値を渡せません

    winnetを使ってPOST形式でサーバにパラメータを渡そうとしていますが、パラメータが渡せずに困っています。 HttpOpenRequestかHttpSendRequestがおかしいと思うのですが、自分では見当がつきません。 よければ何処に問題があるのか教えてください。 環境:vc++2005 int DoHttpRequest( void ) { HINTERNET hInet, hSession, hRequest; DWORD dwTotal = 0; wchar_t param[] = L"type=1"; wchar_t header[] = L"Content-Type: application/x-www-form-urlencoded"; wchar_t accept[] = L"Accept: */*"; // 使ってない BOOL flag; Console::WriteLine( "Http接続START" ); //インターネット(WinInet)初期化 hInet = InternetOpen( NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (hInet == NULL) { Console::WriteLine( "エラー1" ); return -1; } // サーバへ接続 hSession = InternetConnect( hInet, L"192.168.11.25", 9999, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0 ); if( hSession == NULL ) { Console::WriteLine( "エラー2" ); InternetCloseHandle(hInet); return -1; } //HTTPセッションの開始, 指定のURLオープン hRequest = HttpOpenRequest( hSession, L"POST", L"/sample/service.php", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0 ); if (hRequest == NULL) { Console::WriteLine( "エラー3" ); InternetCloseHandle(hSession); InternetCloseHandle(hInet); return -1; } // 送信 flag = HttpSendRequest( hRequest, header, wcslen( header ), param, wcslen( param )); if( flag == FALSE ) { Console::WriteLine( "エラー4" ); InternetCloseHandle(hRequest); InternetCloseHandle(hSession); InternetCloseHandle(hInet); return -1; } //インターネットハンドルの解放 InternetCloseHandle( hRequest ); InternetCloseHandle( hSession ); InternetCloseHandle( hInet ); Console::WriteLine( "Http接続END" ); return 0; }

  • vsftpdにて認証後にエラーが発生します。

    CentOS7にてvsftpdをインストールしたのですが、 外部からうまく接続できず困っております。 ローカルから接続すると問題なく繋がり、正常に動作するのですが、 外部から接続した場合に、ログインの認証が終わったタイミングで、 サーバーから応答が無くなり、タイムアウトしてしまいます。 Connected to ***.jp. 220 (vsFTPd 3.0.2) Name (***.jp:***): userid 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. 421 Service not available, remote server timed out. Connection closed. ローカルの環境で接続すると、最後の行に421~~ではなく ftp> と表示され、操作ができるようになります。 ルータにて、ポートの解放は21のみ行っています。 ファイアーウォール、SELinuxは無効化しております。 vsftpd.confは以下の通りです(コメント行はここにコピーするのに当たり削除しました) anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES ascii_upload_enable=YES ascii_download_enable=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list ls_recurse_enable=YES listen=YES listen_ipv6=NO pam_service_name=vsftpd userlist_enable=YES userlist_deny=NO tcp_wrappers=YES use_localtime=YES seccomp_sandbox=NO user_config_dir=/etc/vsftpd/vsftpd_user_conf 何卒よろしくお願い申し上げます。

  • 演算子を使わない演算

    はじめまして、ヨロシクお願いします。 早速ですが、私は今「入力された数値を7で割った値を表示しろ」という問題に取り組んでいます。これには次の条件があります。 (1)演算子の/を使ってはいけない。 (2)繰り返し処理を使ってはならない。 という縛りがある上で計算をしたいと思っているのですが、なかなかうまくいきません。何かいい方法はないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • この演算子は何の演算子でしょうか?

    下記のようなjavaコードがあります。 int mode = 1; if (true) mode|= 2; System.out.println(mode); これを実行すると結果は3になりますが、 ここで「|」とは何でしょうか? 恥ずかしいですが、 javaを1年半くらいやってきましたけど こんな演算子初めて見ます。 結果からみると 「mode|= 2」が「mode+= 2」と同じになりますが、 「+=」と「|=」は同じものでしょうか?

  • 演算子

    演算子 PHPでなくても、演算子は出てくると思いますが、 $a <> $b $a != $b 両方とも 「$a $bが等しくないときにtrue」ととあるwebページに書いてありますが、 <>と!=はどう違うのでしょうか。

    • ベストアンサー
    • PHP
  • & 演算子について教えてください

    こんにちは & 演算子はアドレスを求めるものですが、これはアセンブラ出力したものと同じでしょうか それとも、プログラムの実行時のアドレスを求めているのでしょうか よろしくお願い致します

  • 演算をどうしてますか?

    PHPでもある程度の計算は可能ですが それ以上の難しい計算はどうやってこなしていますか? 無理矢理PHPで行っていますか? やはりC言語やJAVAに値を投げたりしているんでしょうか? 友達はlinuxで動作させているのでcshでこなしているようですが windowsでも可能でしょうか? その辺のどんな情報でもいいですので よろしくお願いします。

    • 締切済み
    • PHP