有谁知道mailslot如何用?(79分)

  • 主题发起人 主题发起人 zhukairu
  • 开始时间 开始时间
Z

zhukairu

Unregistered / Unconfirmed
GUEST, unregistred user!
我想知道mailslot如何用?
我只知道其可以用来,在局域网中进行广播了。
但不知道如何进行,我搜索了delphibbs中的问题 可惜,没有找到我需要的东西了。
小弟正在做一个局域网聊天程序,但由于机子多,用广播相对较好了。
用udp广播,可小弟,我不懂,
我觉得用mailslot广播时,不需要对方的ip也可以传输了。所以选择了它。
希望那位高手跟小弟说一下原理,以及一些程序设计时需要的代码,再就是适当的给些注解了。
 
找个控件就行了,挺多的。
但maislot只能单播,不能广播。广播还是用UDP吧。
 
http://www.vclxx.org/DELPHI/D32FREE/AKMAILSL.ZIP
 
用油槽很简单,只要用户都装了你的程序,只要有任何一个用户发送了消息,所有的用户
都能收到消息(他们的油槽名是相同的)
 
服务器端:
procedure Tform1.sendonnet(s1:string);
var
ASlotName:string;
FHandle:integer;
A: array[0..9] of Char;
begin
ASlotName := '//' + 'domain' + '/mailslot/' + 'client'; // 开启 MailSlot(档案)
FHandle := CreateFile(pchar(ASlotName),
GENERIC_WRITE, // Client 端对於 MailSlot 只能写入
FILE_SHARE_READ, // 设定为可供分享读取
Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FHandle = INVALID_HANDLE_VALUE then Exit;
StrPCopy(A, S1);
FileWrite(Fhandle, A, Length(s1));
end;

客户端:
function TForm1.ReadFromMailSlot:string;
var
NextSize: DWORD;
MessageCount: DWORD;
Result0: BOOL;
Buffer: pchar;
begin
if FHandle = INVALID_HANDLE_VALUE then Exit;
// 侦测 MailSlot 中是否有资料
Result0 := GetMailslotInfo(Fhandle, nil,
NextSize, @MessageCount, nil);
if not Result0 or (NextSize = MAILSLOT_NO_MESSAGE) then
Exit;
// 如果还有资料 (MessageCount <> 0),逐一读出资料
while Result0 and (MessageCount <> 0) do
begin
// 资料的长度
Buffer := AllocMem(NextSize + 1);
try
// 读出资料
FileRead(Fhandle, Buffer^, NextSize);
result:=StrPas(Buffer);
finally
FreeMem(Buffer, NextSize + 1);
end;
// 继续看看 MailSlot 中还有没有资料
Result0 := GetMailslotInfo(Fhandle, nil, NextSize, @MessageCount, nil);
end;
end;
 
bbs中有你要的答案,我曾经贴过一些源码的,我也找不到了 [:(]
你试试全文检索
要不去网上找一个Messenger的控件,它带源码的,改一下就可以用了
 
多人接受答案了。
 
后退
顶部