邮槽-简单的客户端服务器应用

邮槽是一种单向的方法。也就是说只能由客户端来发送消息,可以有多个服务器来接受消息。并且次链接是广播型的,不安全,容易丢失。

 

但其优点就是容易实现,一般使用邮槽的话,都会在较短的时间内重复发送消息。所以这在一定情况下也弥补了包容易丢失的问题。比如写这样

 

一个应用。写一个每隔五分钟提醒一下公司的可乐售货机上还有多少,每五分钟会给所有的服务器报告一次。

 

开发邮槽客户机和服务器应用时,所有WIN32 API 函数(CreateFile & CreateMailslot除外) 在调用失败的情况下都会 0 值。CreateFile

 

& CreateMailslot 返回的是INVALID_HANDLE_VALUE. 调用失败时,及时调用GetLastError()来获得错误代码。

 

服务器用来创建一个邮槽,然后由客户端来调用写消息,服务器只负责读消息。

 

服务器实现过程:

 

// Server.cpp #include<windows.h> #include<stdio.h> void main() { HANDLE MailSlot; char buffer[256] = ""; DWORD NumbersOfBytesRead; //Create the mail slot if ( ( MailSlot = CreateMailslot( "////.//Mailslot//Myslot", 0, MAILSLOT_WAIT_FOREVER, NULL ) ) == INVALID_HANDLE_VALUE ) { printf( "Failed to create mailslot %d ", GetLastError() ); return; } // Read data from mailslot forever while(ReadFile( MailSlot, buffer, 256, &NumbersOfBytesRead, NULL ) != 0 ) { printf( "%.*s/n", NumbersOfBytesRead, buffer ); } }  

 

Client则是引用和使用上面服务器创建的邮槽

 

对一个邮槽进行引用 要使用 CreateFile 这个API 函数

 

调用 WriteFile 来写,注意最大的消息为64KB

 

//Client.cpp #include<windows.h> #include<stdio.h> void main( int argc, char *argc[] ) { HANDLE MailSlot; DWORD BytesWritten; CHAR ServerName[256] = ""; // Accept a command line argument for the server to send // a messsage to if(argc<2) { printf("Usage: client<server name>/n" ); return; } sprintf( ServerName, "////%s//MailSlot//MySlot", argc[1] ); if((MailSlot = CreateFile( ServerName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) == INVALID_HANDLE_VALUE ) { printf("failed to createfile %d/n", GetLastError() ); return; } if(WriteFile( MailSlot, "This is a test", 14, &BytesWritten, NULL ) == 0 ) { printf("failed to writefile %d/n", GetLastError() ); return; } printf("wrote %d Bytes /n", BytesWritten ); CloseHandle(MailSlot ); } 

你可能感兴趣的:(api,command,File,服务器,null,buffer)