想通过使用API函数来实现对设备/机器进行发送数据,并接收设备返回的数据(注:当对设备发送命令时,设备会自动作出应答,返回命令),
就象TIdUDPServer所实现的功能一样,
发送:
TIdUDPServer.SendBuffer(DesIP,DesPort,Buf,bufSize);
接收:
TIdUDPServer.OnUDPRead(Adata:TSTream....)
begin
直接读取Adata中的数据
并进行操作。
end;
希望大家把知道的告诉我,
都有分,
多谢大家。
就象TIdUDPServer所实现的功能一样,
发送:
TIdUDPServer.SendBuffer(DesIP,DesPort,Buf,bufSize);
接收:
TIdUDPServer.OnUDPRead(Adata:TSTream....)
begin
直接读取Adata中的数据
并进行操作。
end;
希望大家把知道的告诉我,
都有分,
多谢大家。
在哪里有,
我要直接的API哦,
我是想知道用哪些WINSOCK API,
知道的富翁请写下来,并请配点例子语句,
如发送数据为:40 40 40 40 01 fb 05 00 00 00 00 21 00 01 00 00 23
马上给分,
procedure ReadAlarmData(var Message: TMessage); message WM_AlarmSOCK;
AlarmSocket: TSocket;
AlarmUDPADDR: string;
AlarmUDPPORT: Integer;
AlarmSockAddr: TSockAddr;
AlarmSockAddrIn: TSockAddrIn;//同步报警
procedure TfrmDP.actAlarmExecute(Sender: TObject);
var ini: TIniFile;
begin
TAction(Sender).Checked := not TAction(Sender).Checked; if TAction(Sender).Checked then
begin
try
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.INI');
AlarmUDPADDR := ini.ReadString('SERVER', 'AlarmRemoteHost', 'localhost');
AlarmUDPPORT := ini.ReadInteger('SERVER', 'AlarmPort', 5005);
ini.Free; TAction(Sender).Checked := CreateAlarmSocket;
except
on E: Exception do MessageDlg('Error while connecting:' + #13 + E.Message, mtError, [mbOK], 0);
end;
end
else
begin
CloseAlarmSocket(AlarmSocket);
end;
end;function TfrmDP.CreateAlarmSocket: Boolean;
var TempWSAData: TWSAData;
begin
if WSAStartup($101, TempWSAData)=1 then
begin
MessageBox(Application.Handle, '启动报警Socket失败', '报警Socket', MB_ICONINFORMATION + MB_OK);
end; AlarmSocket := Socket(AF_INET, SOCK_DGRAM, 0);
if (AlarmSocket = INVALID_SOCKET) then //Socket创建失败
begin
MessageBox(Application.Handle, PChar(IntToStr(WSAGetLastError()) + ' Socket创建失败'), '报警Socket', MB_ICONINFORMATION + MB_OK);
CloseAlarmSocket(AlarmSocket);
Result := False;
Exit;
end;
//发送方SockAddr绑定
AlarmSockAddr.sin_family := AF_INET;
AlarmSockAddr.sin_addr.S_addr := INADDR_ANY;
AlarmSockAddr.sin_port := htons(AlarmUDPPORT); if Bind(AlarmSocket, AlarmSockAddr, SizeOf(AlarmSockAddr)) <> 0 then
begin
MessageBox(Application.Handle, '绑定失败', '报警Socket', MB_ICONINFORMATION + MB_OK);
Result := False;
Exit;
end;
WSAAsyncSelect(AlarmSocket, {Application.Handle}frmDP.Handle, WM_AlarmSOCK, FD_READ); // 不能使用Applicaton.Handle, 因为它不能响应Socket消息
//接收端SocketAddrIn设定
AlarmSockAddrIn.SIn_Family := AF_INET;
AlarmSockAddrIn.SIn_Port := htons(AlarmUDPPORT);
Result := True;
end;procedure TfrmDP.CloseAlarmSocket;
begin
CloseSocket(AlarmSocket);
end;procedure TfrmDP.DisposeAlarmData(Content: string);
var strType, strDate, strTime, strSource, strSort, strEvent, strUser: string;
I: Integer;
begin
I := Pos(',', Content);
if I>0 then
begin
strDate := Copy(Content, 1, Pos(' ', Content)-1);
strTime := Copy(Content, Pos(' ', Content)+1, I-1 - Pos(' ', Content));
Delete(Content, 1, I);
end; I := Pos(',', Content);
if I>0 then
begin
strSource := Copy(Content, 1, I-1);
Delete(Content, 1, I);
end; I := Pos(',', Content);
if I>0 then
begin
strSort := Copy(Content, 1, I-1);
Delete(Content, 1, I);
end;
{
I := Pos(',', Content);
if I>0 then
begin
strUser := Copy(Content, 1, I-1);
Delete(Content, 1, I);
end;
}
strUser := '监控中心';
if Length(Content) > 0 then
begin
strEvent := Content;
end; {
I := Pos(',', Content);
if I>0 then
begin
strSource := Copy(Content, 1, I-1);
Delete(Content, 1, I);
end;
} lvAlarmInfo.Items.BeginUpdate;
with lvAlarmInfo.Items.Add do
begin
Caption := '报警';
ImageIndex := 2; SubItems.Add(strDate);
SubItems.Add(strTime);
SubItems.Add(strSource);
SubItems.Add(strSort);
SubItems.Add(strEvent);
SubItems.Add(strUser);
end;
lvAlarmInfo.Items.EndUpdate;
end;procedure TfrmDP.ReadAlarmData(var Message: TMessage);
var
Buffer: array[1..4096] of char;
len: Integer;
flen: Integer;
Event: Word;
value: string;
begin
flen := Sizeof(AlarmSockAddrIn);;
AlarmSockAddrIn.SIn_Port := htons(AlarmUDPPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
len := RecvFrom(AlarmSocket, Buffer, Sizeof(Buffer), 0, AlarmSockAddrIn, flen);
value := Copy(Buffer, 1, len);
DisposeAlarmData(value);
end;
end;procedure TfrmDP.SendAlarmData(Content: string);
var
value: string;
len: Integer;
begin
AlarmSockAddrIn.sin_addr.S_addr := inet_addr(PChar(AlarmUDPADDR)); //INADDR_BROADCAST;
value := Content;
len := SendTo(AlarmSocket, value[1], Length(value), 0, AlarmSockAddrIn, SizeOf(AlarmSockAddrIn));
if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
MessageBox(Application.Handle, PChar(IntToStr(WSAGetLastError()) + '报警Socket发送数据'), '报警Socket', MB_ICONINFORMATION + MB_OK); if len = SOCKET_ERROR then
MessageBox(Application.Handle, '报警Socket发送数据失败', '报警Socket', MB_ICONERROR + MB_OK); if len <> Length(value) then
MessageBox(Application.Handle, '报警Socket发送数据中断', '报警Socket', MB_ICONERROR + MB_OK);end;
这些代码很完整,应该可以给你参考了