Windowsのプロセス間通信

1つのプロセスおよびプロセス間通信

  メモリやプロセスにプログラムの実行のために準備ができて、各プロセスは、それが利用可能なコード、データとシステムリソースによって、プライベート仮想アドレス空間を持っているなどのファイル、パイプ、などのコンポーネントを。マルチプロセス/ マルチスレッドがあるのWindows オペレーティングシステムの基本的な機能。マイクロソフトのWin32 アプリケーションプログラミングインターフェース(アプリケーション・プログラミング・インタフェース、API)は、プロセス間通信メカニズムと呼ばれるこれらの活動の行使を交換するためのアプリケーションとデータ共有の仕組みの間で多くの支持を提供(プロセス間通信、IPC)をプロセス間通信は、異なるプロセスを指し、データ共有とデータ交換。  使用なのでのWin32 APIのさまざまな方法を伝えるプロセス、通信の適切な手段を選択する方法は、アプリケーション開発における重要な課題となっている、次の資料はなりWin32の通信プロセスのいくつかの方法を分析し、比較します。

 

2つのプロセス間通信方法

2.1ファイルマッピング   ファイルマッピング(メモリマップファイル)を処理することができるメモリ・アドレス範囲プロセスとしてファイルの内容を処理しました。プロセスはファイルI / O操作を使用していないこのように、ポインタ操作は単純にファイルの内容を読み、修正することができます。Win32 APIは、各プロセスは、独自のアドレス空間内のメモリへのポインタを受け取り、複数のプロセスが同じファイルマッピングオブジェクトにアクセスすることができます。これらのポインタを使用することにより、異なるプロセスが読み取りまたはファイルの内容を変更することができ、ファイル内の共有データを可能にします。アプリケーションファイルマッピングオブジェクトを共有する複数のプロセスを有効にする3つの方法があります。(1)継承:最初のプロセスがファイルマッピングオブジェクトを確立し、その子は、オブジェクトへのハンドルを継承します。(2)ファイルマッピングを名前:ファイルマッピングオブジェクトを作成する際に最初のプロセスは、(ファイル名が異なっていてもよい)オブジェクトに名前を割り当てることができます。第二の方法は、名前でファイルマッピングオブジェクトを開くことができます。加えて、最初のプロセスはまた、いくつかの他のIPCメカニズム(名前付きパイプ、メールスロット、等)を介して第2のプロセスに渡された自分の名前を入れることができます。(3)コピー処理:最初のプロセス確立ファイルマッピングオブジェクトを、次いで第2のオブジェクトハンドルプロセスに他のIPCメカニズム(名前付きパイプ、メールスロット、等)を通過します。第二の方法は、ファイルマッピングオブジェクトへのアクセスを得るためにハンドルを複製します。ファイルのマッピングが複数のプロセス間でデータを共有するのに非常に有効な方法である、より高いセキュリティがあります。しかし、ファイルマッピングは、ネットワークで使用することができないローカルマシン上のプロセス間で使用することができ、開発者は、プロセス間の同期を制御しなければなりません

2.2共有メモリ   のWin32 APIの共有メモリ(共有メモリ)内には、実際にファイルマッピングの特殊なケースです。代わりに、ファイルハンドル(ハンドル)の0xFFFFFFFFの持つファイルマッピングオブジェクトを作成する場合のプロセスは、それが対応するファイルマッピングオブジェクトは、メモリブロックにアクセスすることができるファイルマッピングオブジェクトを開くために、オペレーティングシステムのページファイルメモリから他のプロセスにアクセスされることを意味します。メモリは、ファイルマッピング実装で共有されているので、それは良好な安全性を持っているので、唯一の同じコンピュータ上のプロセス間で実行することができます

2.3匿名コンジット   パイプ(パイプ)は、2つの端部を有する通信チャネルである:一つのプロセスの終了処理することができ、他端は、ハンドルのプロセス間通信を有します。導管であってもよい一方向 -エンドは読み取り専用で、唯一の他のエンドポイントを書き込む。あってもよい双方向 -読み書きの両方のパイプの両端点。匿名パイプ(匿名パイプ)は、同じ親プロセスの2つのサブプロセス間でデータを転送するために一方向パイプラインの名前の有無にかかわらず、親と子プロセスの間です。通常、親プロセス配管によって作成され、その後、読み取りまたはエンドポイントのハンドルを書き込み、その後、通信する通信エンドポイントハンドルのチャネルに子プロセスによって継承されました。親プロセスは、2つ以上の匿名のパイプを継承読み取りおよび書き込みハンドルの子プロセスを作成することができます。これらのサブプロセスは、親プロセスが必要としないパイプを使用して直接通信することができます。   匿名パイプは、単一のマシン上のサブプロセスの標準I / Oリダイレクトを達成するための有効な方法であり、それはインターネットを利用することができない、2つの無関係なプロセス間で使用することができません。

2.4名前付きパイプ   (名前付きパイプ)パイプ名前付きパイプサーバーと1つまたは複数のクライアントプロセスとの間の一方向または双方向通信です。匿名パイプは、名前付きパイプとは異なる任意のプロセスは、所与のに応じて、名前によってパイプの他端を開くことができ、これに名前付きパイプを確立するために、ネームサーバを指定し、関係のないプロセスと別のコンピュータとの間で使用することができます権限とサーバー・プロセスが通信します。名前付きパイプ比較的単純なプログラミング・インタフェースを提供し、データを転送するために、同じコンピュータネットワーク上の2つのプロセス間よりもコミュニケーションがより困難にする、しませんが、あなたはそれが無力複数のプロセスと同時に通信したい場合。

2.5メールスロット   メールスロット(メールスロット)は、プロセス間提供一方向通信能力を任意のプロセスは、メールスロットサーバーにメールスロットを作成することができます。顧客のメールスロットとして知られている他のプロセスは、メールスロットサーバー・プロセスへのメールスロット名を介してメッセージを送信することができます。着信メッセージは、これまでのところ、それを読むために、サーバー・プロセスまで、メールスロットに配置されています。プロセス・サーバーを使用すると、複数のメールスロットにプロセス間の双方向通信を作成できるように、メールスロットメールスロットはまた、クライアントのいずれかとすることができることができます。  メールスロットの溝にメールでローカルコンピュータ上にあってもよく、他のネットワークコンピュータ上のメールスロットまたは指定された場所は、すべてのコンピュータにメッセージを送信するためにメールスロットに同じ名前を持ちます。同報通信メッセージの長さが400バイトを超えないようにすることができ、非ブロードキャストメッセージの長さは、メッセージの最大長さで指定されたメールスロットサーバーが制限されています。   メールスロットと名前付きパイプ似ているが、ネットワークエラーメッセージが正しく受信される保証することができないと、完成された信頼性のないデータグラム(例えばUDPパケットのTCP / IPプロトコル)を介してデータを送信し、データを転送するための名前付きパイプでありますそれは、信頼性の高い接続に基づいて構築されています。しかし、指定されたエリア内のネットワークにメッセージ溝とプログラミング・インターフェースを簡素化する全てのすべてのアプリケーションは、代替にメッセージを送受信した後、ブロードキャストメッセージ、メールスロットのコンピュータの能力。

2.6クリップボード  クリップボード(クリッピングボード)のWin32 APIセットの本質であるデータ伝送のための機能や、メッセージアプリケーションのWindows、Windowsの確立カット(コピー)との中間のデータ共有を提供し、 -ペーストメカニズムは、アプリケーションごとに異なるフォーマット間でデータを共有するための便利な方法を提供します。ユーザは、1つまたは複数のフォーマットのクリップボード上の選択されたデータのアプリケーション、アプリケーションにカットやコピー操作を行った場合。そして、クリップボードからデータを拾うことができ、他のアプリケーションでは、与えられたフォーマットからフォーマットを選択します。クリップボードは、非常に緩い交換媒体である、任意のデータフォーマット、符号なし整数、標準(事前定義)クリップボードフォーマット、値が定義された定数のWin32 APIによって識別される各フォーマットサポートすることができ、非標準フォーマット缶を新しいクリップボード形式を登録するには登録クリップボード形式の関数を使用します。クリップボードのデータフォーマットを使用して交換データは、単純に一致またはフォーマットラインに変換することができます。しかし、クリップボードには、ネットワーク上で使用することはできませんWindowsベースのプログラムで使用することができます。

2.7 DDE   ダイナミックデータエクスチェンジ(DDE)は、アプリケーション間のデータ交換の形態における共有メモリプロセス間通信のために使用されます。DDEアプリケーションがワンタイムデータ伝送を使用することができるとき、それは新しいデータ、更新された値を送信することによって、アプリケーション間の動的データ交換として生じ得ます。DDEとの両方としてクリップボードは(等テキスト、ビットマップ、など)標準的なデータフォーマットをサポートし、それらの定義されたデータフォーマットをサポートすることができます。こうしたメニューから[貼り付け]コマンドを選択するように-彼らのデータ転送メカニズムが異なっている。しかし、有意な差はほとんど常にユーザーが指定した時間の操作に対する応答として、クリップボードの操作です。DDEは、ユーザーによって開始することができますが、それは一般ユーザさらなる介入の役割を果たし続ける必要はありません。DDEデータ交換三つの方法:(1)コールドチェーン:データ伝送のワンタイムデータ交換、クリップボードと同じ。(2)温度チェーン:データ交換サーバがクライアントに通知する場合、クライアントは、新しいデータを要求する必要があります。(3)熱ストランド:データ交換サーバが自動的にクライアントにデータを送信します。DDE交換は、スタンドアロンまたは別のコンピュータのネットワークアプリケーション間で発生する可能性があります。開発者はまた、アプリケーション間のIPCデータ形式のカスタムDDE特定のオブジェクトを定義することができ、それらは、より緊密に結合された通信要件を有します。ほとんどのWindowsベースのアプリケーションは、DDEをサポートしています。

2.8オブジェクトのリンクと埋め込み   (組成物の様々な文書データのフォーマット)オブジェクトのリンクと埋め込み(OLE)を使用して、アプリケーションと管理複合文書を、OLEは、データサービスを編集し、他のアプリケーションを起動するアプリケーションを容易にするために提供します。たとえば、OLEは、ユーザーがスプレッドシートを編集したいときOLEライブラリが自動的にスプレッドシートエディタを起動して、ワードプロセッサ、スプレッドシートを入れ子にすることができ、サポート。ユーザーは、スプレッドシートエディタを終了すると、テーブルには、元のワープロ文書に更新されています。DDE場合、ユーザーが明示的にスプレッドシートエディタを開始したいのに対し、ここでスプレッドシートエディタは、ワードプロセッサに拡張しました。DDEと同じ技術、OLEテクノロジーをサポートするほとんどのWindowsベースのアプリケーション。

2.9ダイナミックリンクライブラリ   内のWin32ダイナミックリンクライブラリ(DLL)グローバルデータは、プロセス間通信はもちろん、アクセスしたときに同期の問題に注意を払って、新しい道を開いたたDLLを共有するすべてのプロセスを呼び出すことができます。プロセス間のデータがDLLが、ビューのデータセキュリティの点で共有することができますが、我々は、このアプローチは、アクセス制御との共有メモリをより有効に利用を提唱していません。

2.10リモートプロシージャコール   に提供リモートプロシージャのWin32 APIコール(RPC)のアプリケーションが関数呼び出しのような単純なようRPCを使用して、ネットワーク上の通信のプロセスを作り、リモート関数呼び出しを使用することができます。RPCは、ネットワークで使用することができる異なるプロセス間の両方のスタンドアローンで使用することができます。RPCのWin32 API提供オベイOSF-DCE(オープンソフトウェア財団分散以来標準。だから、アプリケーション通信RPC 12月のサポートに他のオペレーティングシステム上のWin32 API RPCアプリケーションによって調製しました。RPC開発者は、高性能、密結合分散アプリケーションを構築することができます使用してください。

2.11のNetBios関数   のWin32 APIは、主にIBM NetBIOSおよびWindowsシステムインタフェース用に書かれている低レベルネットワークのNetBios制御を処理するための機能を提供します。これらのアプリケーションは、低レベルのネットワーク機能の特別な要件がない限り、他のアプリケーションは、プロセス間通信のNetBIOS機能を使用しないでください。

ソケット2.12   Windowsソケット仕様が定義された人気のソケット・インタフェース・パラダイムでBSD UNIXのWindowsのUCBerkeley大学の下でネットワークプログラミング・インターフェースのセットです。オリジナルのソケットライブラリの機能に加えて、それはまた、プログラマがプログラミングのためのWindowsメッセージのメカニズムを最大限に活用することを可能にするWindows用の関数のセットを拡張しました。現在、他のIPCメカニズムよりもはるかに優れて主にクロスプラットフォームのソケットのソケット実装プロセス通信ネットワークアプリケーションでより多く、加えのWinSock 2.0 TCP / IPプロトコルをサポートするだけでなく、他のプロトコル(などをサポートするだけでなくIPX)。唯一の欠点は、それが単一のプロセスとの間の単純なデータ転送のため、それは非常に便利になり、基礎となる通信動作によってサポートされていることであるソケットは、この場合は、メッセージWM_COPYDATAがより適切用いて説明します。

2.13 WM_COPYDATAニュース   WM_COPYDATAが知られている、少しが、非常に強力なメッセージです。アプリケーションが別のアプリケーションにデータを送信する場合、送信者は単にSendMessage関数呼び出しを使用し、先のウィンドウパラメータは、データ転送、WM_COPYDATAメッセージの開始アドレスハンドルです。単にデータの共有を実現するように側面を送受信するメッセージ処理のような他の受信機処理WM_COPYデータメッセージ、等。WM_COPYDATAは、それが実際に基本的なファイルマッピングによって実現され、非常に簡単な方法です。欠点は、柔軟性が高くないということであり、それは唯一のスタンドアローンできる環境をWindowsプラットフォーム用。

 

3おわり

  開発者はどのようにそれを選択するように、Win32 APIのは、プロセス間通信を実現するためのアプリケーションのためのオプションのように、さまざまなを提供し?通常、IPCを使用する方法を決定する前に、以下の質問を考慮する必要があります:(1)アプリケーションは、ネットワーク環境で、スタンドアロン環境や仕事です。

 

添付ファイル:

私はここで、混乱と言うウィンドウが常にネットワークに導入することは非常に神秘的な、多くの方法の感じ方には、プロセス間通信をプログラミングするが、いくつかのシステム、常に人々の多種多様を導入している知ったときあなたは私を知らせるための貴重な役割を果たしていることを期待して、これらのメソッドの利点と欠点をコーミング、様々な通信方式を整理。その上で、Windowsのニュース、メモリマッピング、メモリ共有と:プロセス間通信技術は、非標準を持っています。

1. Windowsメッセージは、プロセス間通信を実現しています。受信処理と同じメッセージで定義するメッセージを送信するプロセス。送信者がメッセージのみを送信している場合は、メッセージの送信者はメッセージの応答関数を定義することなく、マッピングを実装することはできません。受信者およびマッピング機能を定義するための対応が必要。インター実装プロセス定義メッセージ通信欠陥は、長い整数のlParamであり、従って、唯一のデータ整形を転送メッセージの送信パラメータに起因するものであるが、文字列を渡すことはできません。ため 差出人の内容を読み取ることがあります可能な考え方は別のプログラムによって送信者を取得した文字列のアドレスが配置されている渡すことで、そのプロセスが処理され、かつ機能ReadProcessMemory WriteProcessMemoryメモリ操作。

転送構造は、この構造に保存されて送信される文字列をCOPYDATASTRUCTを指すポインタであることを除いて同様2.メッセージWM_COPYDATA MFC定義されたカスタムメッセージ実際に共通メッセージング、。このような構造の第一可変dwDataをゼロに設定することができます。上記のさまざまなアイデアが構造体へのポインタを取得することであるというニュースの後、データへのポインタを取得することができ、他の治療を受けていないのプロセスは、同じプロセス内の同じ通信はまた、メッセージことに注意している場合時々得られる所望の長さを受け入れることができない、一部だけを受信することが可能です。したがって、この方法は、データ転送のみ少量のに適しています。

3.プロセス推測メモリはゲイン方法の後方部分と実質的に同じ機能を読み書き。キーは、データを格納するためのメモリ空間を割り当てるためのGlobalAlloc()またはVirtualAllocExを使用することです。データは、受信者のプロセスメモリに書き込まれ、その後、彼のデータを伝えるためにメッセージを対処するために行ってきました。アプリケーションは、送信者の記憶にあるので、その後、VirtualFreeExメモリを取得するために適用する前にいくつかの時間を待つためによく眠れます。上記を達成することができる理由であることができる、メモリに適用する別のプロセスのメモリ空間内のGlobalAlloc()またはVirtualAllocEx理由。言い換えれば、送信者は、メモリのための独自のメモリ空間ではありませんが、受信プロセスのメモリ空間は、メモリを割り当てます。そして、入力データが書き込まれます。もちろん、あなたはまた、送信側アプリケーションのメモリへのプロセス空間は、読書のプロセスに受信者によって読み取られ、道全体に書き込みをすることができます。それはちょうど別のアプローチです。

4.メモリマップドファイルのメモリマッピング方法を使用することの利点は、あなたが処理されるべきメモリ領域としてファイルを扱うことができるということです。ときにファイルが読み込まれ、異なるプロセスに書き込むことができます。ファイルのようにそのメモリ領域ので、このメモリ領域が読み書きするために異なるプロセスで使用することができます。

5.だけでなく、共有コードシェアデータを通信するためにDLLのWin32 DLLを使用し、異なるプロセスが同じDLLファイルをロードし、DLLコードは、メモリにロードされ、これは、ロードされたコードの同じ部分を指しDLLファイル、別のドライブ文字の下に同じDLLファイルは、またそれと同じDLLが、同じDLLの複数のコピーである場合。Win16のDLLは、システムメモリにロードされたので、あなたは簡単にプロセス間通信を実現することができますので、そのグローバル変数にアクセス可能なプロセスを呼び出しています。しかし、Win32のDLLのために、オペレーティング・システムは、プロセスのアドレス空間それぞれ、DLLがプロセスの一部となり、それを呼び出すためにDLLをマッピングします。DLLに次のメソッドを使用することができ、データ領域共有領域に設定されています。

#pragma data_seg( "共有")//共有データセグメントがSHAREDと呼ばれる定義

チャーm_strString [256] = TEXT( ""); //データ共有。特に注意は、コンパイラが初期化されていない変数は、データ・セグメントのBSSに保存されますので、初期化する必要があります。

揮発性のブールbInCriticalSection = FALSE; //フラグ同期

#pragma data_seg()

#pragmaコメント(リンカ、 "/ SECTION:SHARED、RWS")//は、データセグメントは、コンパイラに知らせる共有されます。

CCriticalSection CS;同期制御の同期制御上記//クリティカルセクション、。

 

小さいオーバーヘッドプロセス間通信メカニズムをクリップボードを使用して通信された前記オペレーティングシステムのクリップボードを使用します。クリップボードは原則機構であり、システムのクリップボードにするために予約され、グローバルメモリに一時的プロセス間のデータ交換を保持するために使用されるデータ、。データ処理を提供するグローバルメモリブロックを作成し、メモリブロックに転送またはコピーするデータを移動する必要があります。このメモリ・ブロックを処理する必要が受信処理を完了し、データを読み取ります。

以下の手順では、クリップボードがどのように示すデータを書き込みます

StrData = m_strClipBoardのCString; //は。データを取得

// 。オープンシステムクリップボード
IF(OpenClipboard()!)リターン; 

// 使用する前に、システムのクリップボードの空。
EmptyClipboard(); 

// コピーしたに等しいメモリサイズを割り当てます文字列のサイズ、メモリ・コントローラへのハンドルを返す。
HGLOBAL hClipboardData; 

hClipboardDataはのGlobalAlloc =(GMEM_DDESHARE、strData.GetLength()+を1。); 

// メモリ制御ハンドルロックは、制御ハンドルメモリを指し、特定のデータ値を返しますポインタ・フォーマット。
CHAR * pchData; pchData =(チャー * )GlobalLock(hClipboardData); 

// グローバルメモリに割り当てられたローカル変数の値
strcpyの(pchData、LPCSTR(strData)); 

// グローバルメモリのロックを制御しますロックを解除するハンドル。
GlobalUnlock(hClipboardData)。

// グローバルメモリを介してクリップボードにコピーされるデータを処理する。
SetClipboardData(CF_TEXT、hClipboardData); 

// 使用後クリップボードを閉じ。 
CloseClipboard();

クリップボードからデータ読み込むためのコードを次のとおりです。

// システムクリップボードを開き。
IF(OpenClipboard()!)に戻る; 

// クリップボードのデータ形式のデータが指定されているか否かを判断する。
IF(IsClipboardFormatAvailable(CF_TEXT)|| IsClipboardFormatAvailable(CF_OEMTEXT))
{ 
    // クリップボードから得られたデータ 
    hClipboardData =ハンドル; GetClipboardData(CF_TEXT)を
     // ハンドルによって指定されたデータ形式へのポインタを取得するために、メモリをロックする
    チャー * pchData =(チャー * )GlobalLock(hClipboardData);
     // ローカル変数データを取得するために 
    m_strClipBoard = pchData;
     // メモリハンドルのロックを解除する。
    GlobalUnlock(hClipboardData); 
} 
そう 
{
    AfxMessageBox(" NOテキスト(ANSI)のデータがクリップボードにありません。" ); 
} 

// 使用後のクリップボードを閉じます。
CloseClipboard();
 // 更新データ。 
にupdateData(FALSE);

 

 

7.DDE(動的データ交換)動的データ交換は今、マイクロソフトでは唯一のサポートを維持し、この技術の開発を停止しました。高度な通信技術のフロントいくつかの基本的なプロセス間通信技術、メッセージパイプライン(メッセージパイプ)、メールスロット(メールスロット)、およびソケット(ソケット)であり、実際に、より一般的な方法であり、高度な通信のこれらのタイプに加えてローカル・システムのような上記の方法は、プロセス間で通信するようにそれはまた、異なるシステム間の遠隔通信のために使用することができます。

8.メッセージパイプメッセージ匿名パイプ(匿名パイプ)に分けパイプ、および名前付きパイプ(名前付きパイプ)、主に彼が始めた、ローカルシステム上の子と親プロセス間の通信に使用される匿名パイプ。いくつかのシニア名前付きパイプは、異なるシステム上のプロセスの間でおよびUNIX、LINUXので、この技術をサポートしているため、その後、通信することができますので、名前付きパイプの技術は、理想的なC / S構造の通信技術です。原則として名前付きパイプ、プロセスパイプラインへのデータは、パイプラインは、多くの場合、削除データに別の名前を知っています。その他には、データを処理することができ、パイプラインの名前を削除することはできませんわかりません。したがって、パイプラインは、実際には、プロセスメモリ間で共有されます。サーバプロセスが呼び出されたパイプラインのパイプを作成し、プロセス・パイプラインは、クライアントをリンクしています。ConnectNamedPipe()を閉じ、データのMFを読んだり書い;接続パイプにおいてCallNamedPipe(); CreateNamedPipe(....)をハンドルであるパイプラインを作成するための機能サーバーは、クライアントのプロセス配管に接続し、顧客の接続まで待機する準備ができていますこれまでのところ。DisconnectNamedPipe(); PeekNamedPipeは、名前付きパイプ()の情報を取得する;名前付きパイプ状態情報GetNamedPipeInfo()を取得するステップと、クライアントとGetNamedPipeHandleStateサーバ)(切断導管からバッファSetNamedPipeHandleState()にデータをコピーし、提供状態情報及び導管TransactNamedPipeを(入力)読み取りまたは(メッセージWaitNamedPipeパイプを書き込みメッセージ)からのメッセージを、サーバがクライアントインスタンスからの接続を待ちます。基本的な流れ連絡管

(1)接続を確立するためには、ConnectNamedPipe関数を介して取得したクライアントからの要求をリッスンする名前付きパイプのサーバインスタンスを確立し、その後ConnectNamedPipe()関数を介して行われます。この機能は、待機時間を設定することができます。クライアントは、単にサーバーに接続する機能WaitNamedPipe()を使用します。

(2)それらの間の通信接続を確立する間の通信パイプはReadFile()およびWriteFile()のためのファイルハンドルを使用することによって得ることができます。

(3)接続が終了され、クライアントがCLOSEFILE()を呼び出し、サーバ側は接続を終了します)(DisconnectNamedPipeを呼び出します。そして、パイプラインを閉鎖するCloseHandleをする必要があります。

9.邮槽通信

10.通信ソケットソケット通信プロセスは、単にメイン関数呼び出し5として記述することができ、ソケット()、バインド()、(聞く)、(接続))(受け入れる。メインコールサーバソケット() 、バインド()、(聞く)、()受け入れます。主なクライアントは、connect()を、)(ソケットを呼び出します。両当事者は、()およびRECV()を送信することにより、データ転送が完了しています。ソケットタイプ、SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_SEQPACKET、SOCK_RDMの5種類があります。

10.1のWinsockプログラムの設計プロセス

(1)ビルド環境プログラムは、機能のWinsockプログラミング、Socket1.1とSocket2.0。柔軟なミックスの2セットがあります。Socket2.0は、より強力な機能を持っています。前記ヘッダは、ライブラリ・ファイルとそれに対応するファイルを含みます。

// Socket2.0
#含める
#pragmaコメント(libに、「WS2_32.LIB」);
 
// Socket1.1
#含める
#pragmaコメント(libに、「WSOCK32.LIB」);

(2)選択メカニズム(非同期?非ブロッキング?)デフォルトブロッキングソケットの場合は作成されます。またはWSAAsynSelectを選択することができます()関数は、非ブロックにそれを有効にすることです。この機能の使用には特に注意がないだけでのioctlsocket(による非ブロッキング、)それはその後、ブロックされたモードになっています。これら2つの関数はブロックモードを変更するということは異なっています。ioctlsocket()は、再びモードをブロックするソケットの非同期モードですが、すべての非同期イベント、WSAAsynSelect(S、hWndを、0,0)をキャンセルするWSAAsynSelect()を呼び出す前に、

(3)起動とスタート機能WSAStartupのを終了()接続のWinsock DLLを確立するために、DLLを終了関数WSAClearup()を終了、これら二つの機能はペアで使用しなければなりません。

(4)エラーが将来のマルチスレッド環境との互換性のためのWinsockを扱う二つの最近のエラー番号エラーハンドラは、現在のスレッドを取得し、設定する、即ちWSAGetLastError()とWSASetLastError()。

ます。https://www.cnblogs.com/RicoRico/archive/2013/03/10/2953208.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33816946/article/details/93955637