如何正确发送数据包到UDP服务器?我正在尝试,但它没有工作,我没有从服务器收到任何东西.
我需要的是发送一个数据包: int64|int|int
并从服务器接收数据包: int|int|int64
怎么做正确?谢谢.
type
Tconnecting = record
a: int64;
b: integer;
c: integer;
end;
Treply_connect = record
a: integer;
b: integer;
c: int64;
end;
var
udp: TIdUDPClient;
send_data: TIdBytes;
received_data: TIdBytes;
i: integer;
packet: Tconnecting;
reply_packet: Treply_connect;
begin
packet.a := 41727101980;
packet.b := 0;
packet.c := RandomRange(1, 9999999);
SetLength(send_data, sizeof(packet));
Move(packet, send_data[0], sizeof(packet));
udp := TIdUDPClient.Create(nil);
try
udp.Host := 'server.com';
udp.Port := 1234;
udp.SendBuffer(send_data);
SetLength(received_data, 0);
i := udp.ReceiveBuffer(received_data, 5000);
Memo1.Lines.Add('Data reiceived! Len:'+IntToStr(Length(received_data))+',data:|'+BytesToString(received_data, 0)+'|');
finally
FreeAndNil(udp);
end;
Run Code Online (Sandbox Code Playgroud) 我遇到一些使用TFileStream从文件到动态数组读取数据块的Delphi代码.编写代码的最初目的是比较具有相同大小但可能具有不同日期和时间戳的两个文件的内容,以查看内容是否相同.这是通过将来自该对的每个文件的数据读入单独的动态数组并将一个数组的每个字节与另一个数组的相应字节进行比较来完成的.
代码对TFileStream.Read进行多次调用.大约75次调用后,程序崩溃并显示"Out of Memory"错误消息.
读取数据块的大小似乎并不重要,它似乎是导致错误消息的调用数.
代码是我编写的一个函数,只要程序遇到需要比较的两个文件就会在其他地方调用(由于我不会进入的原因,可能是四十或五十个不同的文件对).无论是以小块读取的单个文件还是以整体读取的多个文件,都会发生"Out of Memory"错误.它似乎是错误决定因素的调用次数.
虽然我意识到可能有更优雅的方式来实现文件的比较,而不是我在下面显示的,我真正想知道的是使用TFileStream和/或SetLength调用导致记忆问题.我已经尝试在每次调用后释放内存(如代码所示)并且似乎没有任何区别.
如果有人能解释出了什么问题,我将不胜感激.
function Compare_file_contents(SPN,TPN : String; SourceFileSize : int64) : boolean;
var
SF : TFileStream; //First file of pair for comparison
TF : TFileStream; //Second file of pair
SourceArray : TBytes; // Buffer array to receive first file data
TargetArray : TBytes; //Buffer array to receive second file data
ArrayLength : int64; //Length of dynamic array
Position : int64; //Position within files to start each block of data read
TestPosition : int64; …Run Code Online (Sandbox Code Playgroud) 我必须在"Everyone"用户组的某个文件夹上设置prmissions,所以我需要这个组的SID.当我打电话时,ConvertStringSidToSid()我得到错误"System Error. Code: 87 - Parameter is incorrect".为什么?我的代码出了什么问题?
...
function ConvertStringSidToSid(StringSid: LPCTSTR; Sid: PSID): BOOL; stdcall;
external Advapi32 name 'ConvertStringSidToSidW';
...
var
Sid: PSID;
...
Sid := Nil;
ConvertStringSidToSid(LPCTSTR('S-1-1-0'), Sid);
...
Run Code Online (Sandbox Code Playgroud)
TIA Branko
我不知道这只是我遗漏了什么,但我对此问题感到非常沮丧.
当我尝试设置.color属性时,没有可用的值,例如claBlue.
例如:
Canvas.Stroke.Color := claBue.
Run Code Online (Sandbox Code Playgroud)
我错过了参考吗?我已经包括FMX.Types.
我正在使用Delphi XE3,以下是我的示例应用程序:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function Send(const FromAddr, ToAddr, Subject: String; const AttachFiles: array
of string; const MsgBody: String): boolean;
end;
var
Form1: TForm1;
implementation
uses Winapi.Mapi;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Send('', 'lmengyew@gmail.com', 'test', [], '');
end;
function TForm1.Send(const FromAddr, ToAddr, Subject: String; const
AttachFiles: array of string; const MsgBody: String): boolean;
var Msg: TMapiMessage;
lpSender, lpRecipient: …Run Code Online (Sandbox Code Playgroud) 美好的一天 ...
我下载的生成Socket'm使用错误的程序except on E: EIdSocketError the begin......他向我表明生成错误......但我想解决这个错误...,因为它与我下载网站断开,和他对于该程序,我无法返回任何下载...除非您关闭该程序并重新打开...
我怎么能得到这个错误,让他尝试重置一个新的网站连接,而我不必重新启动程序...所以我回去下载最新下载的文件....因为有套接字错误必须重新启动程序并返回下载Zero ... 1mb文件很小,但它们大约200下载:
on E: EIdSocketError do begin
ShowMessage('Socket 2');
// +++++------
FreeAndNil(fileDownload);
fileDownload := TFileStream.Create(local_exe+'media_'+IntToStr(down_num)+'.mp4', fmCreate);
IdHTTP.Get(montarURL, fileDownload);
Memo1.Lines.Add(formatdatetime('dd/mm/yyyy',now)+' '+formatdatetime ('hh:mm:ss',now)+' Lista '+IntToStr(numero_tentativa_loop_um)+'. Connection restored.');
end;
Run Code Online (Sandbox Code Playgroud) 我在这里做了一些关于上面给出的问题的研究并得出以下代码:
VarStr = array of WideChar;
function ArrayToString(const a: VarStr): UnicodeString;
begin
if Length(a) > 0 then
begin
ShowMessage ('Länge des übergebenen Strings: ' + IntToStr(Length(a)));
SetString(Result, PWideChar(@a[0]), Length(a) div 2)
end
else
Result := '';
end;
Run Code Online (Sandbox Code Playgroud)
ShowMessage在给定数组中显示正确的字符数,但该函数的结果始终为空字符串.
你的想法好吗?
为什么LongMonthNames[X]单独(没有名称空间前缀)在Delphi XE7中不起作用,而它在Delphi XE2中工作?
program LongMonthNames_Test;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
begin
try
// Works in both Delphi XE2 and Delphi XE7:
Writeln(System.SysUtils.FormatSettings.LongMonthNames[12]);
// Works only in Delphi XE2, does NOT work in Delphi XE7:
// ("not work" obviously means does not compile because of errors in the source code)
Writeln(LongMonthNames[12]);
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud) 我正在使用Delphi XE3.当搜索帮助TObjectList时,我发现它出现在两个单元中:
http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Contnrs.TObjectList
和
http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Generics.Collections.TObjectList
在这种情况下,我应该包括使用哪个单元?还有什么是TObjectList和TList之间的区别,我只是在第一个文档中看到TObjectList = class(TList),所以TObjectList与TList相同?
谢谢
delphi ×10
delphi-xe3 ×10
c++ ×1
delphi-xe2 ×1
delphi-xe7 ×1
indy ×1
indy10 ×1
mapi ×1
memory ×1
tfilestream ×1
winapi ×1
windows-7 ×1