////////////////////////////////////////////////////////////////////////////////////////////////////////////SpecialSample2 //メールスロット //IP通信のUDPのイメージと似ている。 //同一ネットワークセグメント上で送信側からひとつ以上の受信側に一方向の通信を提供する //到着保証なし、一斉同報が可能等の特徴がある ////////////////////////////////////////////////////////////////////////////////////////////////////////////SpecialSample2 void CShareDlg::OnButton137() { HANDLE hMailSlot ; //メールスロットは一方向のみの通信をサポートするのでこのハンドルを使用してのWriteFileはエラーとなる 受信のみとなる。 if( ( hMailSlot = CreateMailslot( //このコンピュータにメールスロット「miha」を作成するって事 "\\\\.\\mailslot\\miha", //メッセージの最大長 0=指定しない 0, //タイムアウト 0=なし(すぐに制御を戻す) 0, NULL ) ) == INVALID_HANDLE_VALUE ) { OutErrorString(); TRACE( "error CreateMailslot\n" ) ; return ; } char pszWork1[4096]; DWORD nDataSize; DWORD Msgs; DWORD nReadByte; while(TRUE){ //受信箱にデータが有るかを見る if( !GetMailslotInfo( hMailSlot , (LPDWORD)NULL, &nDataSize, &Msgs, (LPDWORD) NULL ) ) { OutErrorString(); TRACE("error GetMailslotInfo\n" ) ; CloseHandle( hMailSlot ) ; return ; } //受信箱にデータが有った if( Msgs ) { //受信箱から読込み if( !ReadFile( hMailSlot , pszWork1, nDataSize, &nReadByte, (LPOVERLAPPED) NULL) ) { OutErrorString(); TRACE("error ReadFile\n" ) ; CloseHandle( hMailSlot ) ; return ; } TRACE("%s\n", pszWork1 ) ; //表示 MessageBox(pszWork1); if( strncmp( pszWork1, "quit", 4 )==0 ) { break; } } else{ //受信箱にデータが無いのでSleep Sleep(500); } } CloseHandle(hMailSlot ); } //Clientから送信という文字列を送信 void CShareDlg::OnButton138() { char pszWork1[256] ; HANDLE hMailSlot ; DWORD nWriteByte ; hMailSlot = CreateFile( "\\\\.\\mailslot\\miha", //このコンピューターのメールスロットmihaを開けって意味 // hMailSlot = CreateFile( "\\\\domain\\mailslot\\miha", //この指定したドメインの全部のコンピュータのメールスロットmihaに同胞送信するって意味 // hMailSlot = CreateFile( "\\\\*\\mailslot\\miha", //このコンピューターの属するネットワークセグメント内の全部のコンピュータのメールスロットmihaに同胞送信するって意味 // hMailSlot = CreateFile( "\\\\lucky7\\mailslot\\miha", //コンピューター名lucky7のコンピュータのメールスロットmihaに送信するって意味 // いずれにしても一方法の通信しかありえないので、このハンドルを使用してReadFileはエラーとなる GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ; // if( hMailSlot == INVALID_HANDLE_VALUE ) { OutErrorString(); TRACE("error CreateFile\n" ) ; return ; } strcpy(pszWork1, "Clientから送信"); if( !WriteFile( hMailSlot , pszWork1, (DWORD)strlen( pszWork1 ) + 1, &nWriteByte, NULL ) ) { OutErrorString(); TRACE("error WriteFile\n" ) ; CloseHandle( hMailSlot ) ; return ; } CloseHandle(hMailSlot ); } //通信終了 void CShareDlg::OnButton139() { char pszWork1[256] ; HANDLE hMailSlot ; DWORD nWriteByte ; hMailSlot = CreateFile( "\\\\.\\mailslot\\miha", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ; if( hMailSlot == INVALID_HANDLE_VALUE ) { OutErrorString(); TRACE("error CreateFile\n" ) ; return ; } strcpy(pszWork1, "quit"); if( !WriteFile( hMailSlot , pszWork1, (DWORD)strlen( pszWork1 ) + 1, &nWriteByte, NULL ) ) { OutErrorString(); TRACE("error WriteFile\n" ) ; CloseHandle( hMailSlot ) ; return ; } CloseHandle(hMailSlot ); }