此短信平台

图片 1

delphi断点无效,自动跳过代码
//定义

//十六进制(S)-->>十进制(I)  [重写:Jey]
function hextoint(s: string): Integer; 
begin           //$代表16进制
  Result:=StrToInt('$'+s);
end;

//十六进制-->>十进制 [重写:Jey]
function hextoint(s: string): Integer;
begin //$代表16进制
Result:=StrToInt;
end;

此短信平台,匡助高卢鸡wavecom短信猫.有VB及DELPHI示例程序

type
PlayerInfo = record //客户端新闻
ID: pchar;
GameHwnd: int64; //游戏句柄
ClientHwnd: int64; //dll的窗体句柄
Account: pchar; //账号
PassWord: pchar; //密码
RealmName_1: pchar; //服务器
RealmName_2: pchar;
playername:pchar;
Team:pchar;//队伍
Task:pchar;//功能
CmdCode:pchar;
Gamepath:pchar;
end;
pplayerinfo = ^playerinfo;

//十进制转变为二进制字符串  [重写:Jey]
function inttoBin(i: integer): string;
begin
 while i <>0 do
 begin              //i mod 2取模,再使用format格式化
   result:=Format('%d'+result,[i mod 2]);
   i:=i div 2
 end
end;
//二进制(S)-->>十进制(D)    [重写:Jey]
uses Math;
function hextoint(s: string): Double;
begin
  while Length(s) <>0 do
  begin              //2^(长度-1)次方
    if s[1]='1' then  Result:=Result+power(2,Length(s)-1);
    s:=Copy(s,2,Length(s));
  end
end;
//十进制(I)-->>十六进制(S)
//D自带函数,Digits长度,一般设4.
function IntToHex(Value: Integer; Digits: Integer): string;

//十进制转变为二进制字符串 [重写:Jey]
function inttoBin(i: integer): string;
begin
while i <>0 do
begin //i mod 2取模,再使用format格式化
result:=Format('%d'+result,[i mod 2]);
i:=i div 2
end
end;
//二进制-->>十进制 [重写:Jey]
uses Math;
function hextoint(s: string): Double;
begin
while Length <>0 do
begin //2^次方
if s[1]='1' then Result:=Result+power(2,Length;
s:=Copy(s,2,Length;
end
end;
//十进制-->>十六进制
//D自带函数,Digits长度,一般设4.
function IntToHex(Value: Integer; Digits: Integer): string;

 

var
pplayer: PlayerInfo; {这一个将会已指针的措施传送给线程, 它应该是全局的}
T_伊芙nt: Cardinal = 0; //事件内核

//数据(S)-->>二进制(S)
//任何数据都以以二进制情势积攒的! (转)
function conertde(s:string):string;
var
 i:integer;
begin
 for i:=1 to length(s) do
   result:=result+inttohex(ord(s[i]),2);
end; 

//数据-->>二进制
//任何数据都以以二进制格局累积的!
function conertde:string;
var
i:integer;
begin
for i:=1 to length do
result:=result+inttohex,2);
end;

颠倒是非表明
0 成功
-1 连接短信平台倒闭
-2 命令推行停业
-3 无可读短信

function LoginGame(ptr: pointer): boolean; stdcall;
//登入游戏的线程
var

一、WSAStartup函数
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
使 用Socket的程序在使用Socket在此之前必需调用WSAStartup函数。该函数的首先个参数指明程序央浼使用的Socket版本,个中高位字节指 明副版本、低位字节指明主版本;操作系统利用第2个参数重返须要的Socket的版本音信。当一个应用程序调用WSAStartup函数时,操作系统依照伏乞的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。今后应用程序就足以调用所央求的Socket库中的其它Socket函数了。该函数执行成功后重返0。
例:要是二个顺序要动用2.1版本的Socket,那么程序代码如下
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );

一、WSAStartup函数
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
使 用Socket的先后在运用Socket在此以前必须调用WSAStartup函数。该函数的第贰个参数指明程序需要使用的Socket版本,当中高位字节指 明副版本、低位字节指明主版本;操作系统利用第2个参数再次回到央浼的Socket的版本消息。当五个应用程序调用WSAStartup函数时,操作系统依照诉求的Socket版本来寻找相应的Socket库,然后绑定找到的Socket库到该应用程序中。以往应用程序就能够调用所央浼的Socket库中的其它Socket函数了。该函数实施成功后再次来到0。
例:假若多个前后相继要使用2.1版本的Socket,那么程序代码如下
wVersionRequested = MAKEWORD;
err = WSAStartup( wVersionRequested, &wsaData );

function ConnectToServer(aServerName, aLogID, aPass: pchar): integer; stdcall;
函数表明:
连接平台的后台数据库
参数表达:
aServerName 平台的后台数据库所在的服务器名称
aLogID 登入数据库服务器所需的客户名
aPass 登入数据库服务器所需的密码

i, c: Integer;
num: integer; //ID
hmodule: thandle;

二、WSACleanup函数
int WSACleanup (void);
应用程序在实现对伏乞的Socket库的接纳后,要调用WSACleanup函数来清除与Socket库的绑定何况释放Socket库所攻陷的系统能源。

二、WSACleanup函数
int WSACleanup ;
应用程序在成功对哀告的Socket库的应用后,要调用WSACleanup函数来扫除与Socket库的绑定况且释放Socket库所私吞的系统能源。

function DisConnectToServer: integer; stdcall;
函数表达:
断开平台的后台数据库连接

installkeyProc: function(hwindow: hwnd): boolean;
gamehprocess, module: Cardinal;

三、socket函数
SOCKET socket(
int af,
int type,
int protocol
);
应 用程序调用socket函数来创设多个能够进行网络通讯的套接字。第二个参数钦赐应用程序使用的通讯左券的公约族,对于TCP/IP公约族,该参数置 PF_INET;第二个参数指定要创设的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第多个参数钦命应 用程序所运用的通信公约。该函数假若调用成功就回到新创设的套接字的描述符,借使战败就再次来到INVALID_SOCKET。套接字描述符是三个整数体系的 值。各样进度的经过空间里都有二个套接字描述符表,该表中寄存着套接字描述符和套接字数据结构的照望关系。该表中有多个字段寄存新创立的套接字的描述符, 另二个字段寄放套接字数据结构的地址,由此依附套接字描述符就足以找到其对应的套接字数据结构。每个进度在温馨的历程空间里都有多少个套接字描述符表但是套 接字数据结构都以在操作系统的根本缓冲里。上边是叁个创设流套接字的事例:
struct protoent *ppe;
ppe=getprotobyname("tcp");
SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);

三、socket函数
SOCKET socket(
int af,
int type,
int protocol
);
应 用程序调用socket函数来制造一个可见进行网络通讯的套接字。第二个参数钦命应用程序使用的通讯左券的公约族,对于TCP/IP公约族,该参数置 PF_INET;第一个参数钦点要创立的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第八个参数内定应 用程序所运用的通信合同。该函数如若调用成功就回到新创设的套接字的描述符,固然退步就再次来到INVALID_SOCKET。套接字描述符是二个平头类型的 值。各个进程的历程空间里皆有叁个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的相应关系。该表中有一个字段存放新创造的套接字的描述符, 另叁个字段存放套接字数据结构的地方,由此根据套接字描述符就能够找到其对应的套接字数据结构。每种进度在投机的长河空间里都有二个套接字描述符表可是套 接字数据结构都以在操作系统的基业缓冲里。上面是多少个成立流套接字的例证:
struct protoent *ppe;
ppe=getprotobyname;
SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);

function CreateIniDb: integer; stdcall;
函数表明:
初叶化平台的后台数据库脚本

gameh, childhwnd, filehwnd: int64;
TextFile: TStringList;
filepath: string;
Curp: PlayerInfo; {因为指针参数给的点每一天都在变, 需用线程的一对变量存起来}
//有时变量
ID: pchar;
GameHwnd: int64; //游戏句柄
ClientHwnd: int64; //dll的窗体句柄
Account: pchar; //账号
PassWord: pchar; //密码
RealmName_1: pchar; //服务器
RealmName_2: pchar;
playername:pchar;
Team:pchar;//队伍
Task:pchar;//功能
CmdCode:pchar;
Gamepath:pchar;
begin
EnterCriticalSection; //踏入临界区
try
result := False;
Curp := pPlayerInfo^;

四、closesocket函数
int closesocket(
SOCKET s
);
closesocket 函数用来关闭三个描述符为s套接字。由于每一个进度中都有贰个套接字描述符表,表中的各样套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构, 因而有非常大恐怕有多少个套接字描述符指向同二个套接字数据结构。套接字数据结构中等专门的学业高校门有三个字段寄存该协会的被援引次数,即有多少个套接字描述符指向该协会。当 调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,借使为1,就标注唯有贰个套接字描述符指向它,由此操作系统就先把s在 套接字描述符表中对应的那条表项清除,而且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,並且把 s对应的套接字数据结构的引用次数减1。
closesocket函数借使实践成功就重返0,不然再次来到SOCKET_ERROR。

四、closesocket函数
int closesocket(
SOCKET s
);
closesocket 函数用来关闭贰个描述符为s套接字。由于每一个进程中都有三个套接字描述符表,表中的各种套接字描述符都对应了一个位居操作系统缓冲区中的套接字数据结构, 由此有望有多少个套接字描述符指向同一个套接字数据结构。套接字数据结构中等专门的学问高校门有二个字段存放该组织的被援用次数,即有几个套接字描述符指向该组织。当 调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,就算为1,就注脚独有八个套接字描述符指向它,由此操作系统就先把s在 套接字描述符表中对应的那条表项清除,何况释放s对应的套接字数据结构;假若该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把 s对应的套接字数据结构的引用次数减1。
closesocket函数假如实行成功就再次来到0,不然重回SOCKET_ERROR。

function SendASms(aPhone, aContent, aremark: pchar): integer; stdcall;
函数表明:
写短信到平台的后台数据库
参数表明:
aPhone 接收短信的人
aContent 短信的剧情
aremark 备注

//这里开头往下断点无效,会活动跳过
ID:=Curp.ID; //那一个createthread传递踏入的结构体,参数多了,传递的值会出错
ClientHwnd:=Curp.ClientHwnd;
Account:=Curp.Account;
PassWord:=Curp.PassWord;
RealmName_1:=Curp.RealmName_1;
RealmName_2:=Curp.RealmName_2;
playername:=Curp.playername;
Team:=Curp.Team;
task:=Curp.Task;
//直到这里可以下断点,中间这一块全部跳过
cmdcode:=Curp.CmdCode;
Gamepath:=Curp.Gamepath;
SetEvent; //设置触发
filepath := Gamepath + 'dataconfig.ini';
if FileExists then
begin
//假使文件存在,则开展修改和足够
TextFile := TStringList.Create;
TextFile.LoadFromFile;
for I := 0 to TextFile.Count - 1 do
begin
if Pos('SaveAccount', TextFile[i]) > 0 then
begin
TextFile.Delete;
TextFile.Insert(i, 'SaveAccount = ' + '0');
end;
end;
TextFile.SaveToFile;
if TextFile <> nil then
begin
TextFile.Free;
TextFile := nil;
end;
end;
//参数一:进度路径
//参数二:命令行
//参数八:子进度职业渠道
if createprocess(pchar(gamepath+'asktao.mod'),
pChar('des:'+CmdCode),
nil, nil, False,
0,
nil, gamepath, StartupInfo, ProcessInfo) then
begin
gameh := GetHwndFromProcess(ProcessInfo.dwProcessId);
for c := 0 to 60 do
begin
if gameh = 0 then
begin
Sleep;
gameh := GetHwndFromProcess(ProcessInfo.dwProcessId);
end
else
break;
end;
end;
if gameh > 0 then
begin
if KeyHook then
FormMain.Memo1.Lines.Add('dll安装成功');
//安装完毕后,客商端窗体会创立三个DLL窗体,类名称叫Tform1
//遍历全数进程,跟进度ID同样,而且窗体类名称为Tform1
//则表示dll窗体伊始化成功,可以发送Data告诉她去登录
for c := 0 to 30 do
begin
childhwnd := GetChildwindows(ProcessInfo.dwProcessId);
if childhwnd > 0 then
begin
Break;
end
else
Sleep;
end;
//成功创立窗口,能够最头阵送数据,并让他最先活动登入
//假诺child窗口为0,则代表登录失利,大概creatprocess开端是循环
//败北了重复再开三个窗口,记得关闭这么些窗口

五、send函数
int send(
SOCKET s,
const char FAR *buf,
int len,
int flags
);
不 论是顾客依然服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送诉求,而服务器则平日用send函 数来向客商程序发送应答。该函数的首先个参数钦点发送端套接字描述符;第2个参数指明一(Aptamil)个存放应用程序要发送数据的缓冲区;第八个参数指明实际要发送的数 据的字节数;第八个参数一般置0。这里只描述同步Socket的send函数的实行流程。当调用该函数时,send先比较待发送数据的尺寸len和套接字 s的发送缓冲区的长短,假设len大于s的发送缓冲区的长度,该函数重临SOCKET_ELacrosseRO奔驰M级;固然len小于大概等于s的发送缓冲区的长度,那么 send先反省左券是不是正在发送s的发送缓冲中的数据,假使是就等候公约把数量发送完,假若协商还不曾起来发送s的殡葬缓冲中的数据依然s的发送缓冲中没有数量,那么send就比较s的发送缓冲区的剩余空间和len,假设len大于剩余空间大小send就一向等候左券把s的发送缓冲中的数据发送完,假设len小于剩余空间大小send就一味把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传 的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。倘使send函数copy数据成功,就回到实际copy的字节数,如若send在copy数据时出现谬误,那么send就回来SOCKET_E揽胜ROLX570;如若send在等候合同传送数据时网络断开的话,那么send函数也重返SOCKET_E奥迪Q5ROCRUISER。要细心send函数把buf中的数据成功copy到s的出殡缓冲的剩余空间里后它就回到了,可是此时这一个多少并不一定立即被 传到延续的另一端。即便协商在一连的传递进程中冒出网络错误的话,那么下贰个Socket函数就能够再次回到SOCKET_E路虎极光RO奥迪Q5。(每叁个除send外的 Socket函数在推行的最起首总要先等待套接字的出殡和埋葬缓冲中的数据被协议传送实现技巧继续,假若在守候时出现互联网错误,那么该Socket函数就回去 SOCKET_ERROR)
瞩目:在Unix系统下,如若send在等候公约传送数据时网络断开的话,调用send的历程会接到到一个SIGPIPE时域信号,进程对该连续信号的私下认可管理是进度终止。

五、send函数
int send(
SOCKET s,
const char FAR *buf,
int len,
int flags
);
不 论是客商依旧服务器应用程序都用send函数来向TCP连接的另一端发送数据。客商程序一般用send函数向服务器发送央浼,而服务器则平时用send函 数来向客商程序发送应答。该函数的首先个参数内定发送端套接字描述符;第2个参数指圣元(Synutra)个存放应用程序要发送数据的缓冲区;第4个参数指明实际要发送的数 据的字节数;第多少个参数一般置0。这里只描述同步Socket的send函数的推行流程。当调用该函数时,send先比较待发送数据的长度len和套接字 s的发送缓冲区的尺寸,借使len大于s的发送缓冲区的长短,该函数重回SOCKET_EPRADOROENVISION;借使len小于或然等于s的发送缓冲区的尺寸,那么 send先反省左券是还是不是正在发送s的发送缓冲中的数据,倘使是就等候公约把数量发送完,假若协商还未有起来发送s的出殡和埋葬缓冲中的数据依旧s的发送缓冲中未有数量,那么send就比较s的发送缓冲区的剩下空间和len,假诺len大于剩余空间大小send就一向等候左券把s的发送缓冲中的数据发送完,假诺len小于剩余空间大小send就只有把buf中的数据copy到剩余空间里(注意实际不是send把s的出殡缓冲中的数据传到连接的另一端的,而是契约传 的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。假使send函数copy数据成功,就回去实际copy的字节数,如若send在copy数据时现身错误,那么send就回到SOCKET_E奥德赛ROLAND;纵然send在等候左券传送数据时互连网断开的话,那么send函数也返回SOCKET_E猎豹CS6ROMurano。要注意send函数把buf中的数据成功copy到s的发送缓冲的盈余空间里后它就回去了,然而此时这个数量并不一定立刻被 传到连年的另一端。假诺协商在延续的传递进程中冒出互联网错误的话,那么下八个Socket函数就能回去SOCKET_E奥迪Q3RO本田CR-V。(每三个除send外的 Socket函数在实践的最早步总要先等待套接字的出殡和埋葬缓冲中的数据被公约传送达成工夫承接,要是在伺机时出现互连网错误,那么该Socket函数就回到 SOCKET_ERROR)
在意:在Unix系统下,假若send在等待公约传送数据时互连网断开的话,调用send的进程会摄取到四个SIGPIPE时域信号,进程对该功率信号的暗中同意管理是经过终止。

function ReadASms(var aPhone, aContent, aSendDateTime: pchar): integer; stdcall;
函数表明:
从阳台的后台数据库中读取一条未读短信
参数说明:
aPhone 发送短信的人
aContent 短信的内容
aSendDateTime 短信发送的时间

end;result := True;Isloading := false;LeaveCriticalSection; //离开临界区ExitThread;

六、recv函数
int recv(
SOCKET s,
char FAR *buf,
int len,
int flags
);
不 论是客商依旧服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的率先个参数钦定接收端套接字描述符;第三个参数指贝拉米个缓冲区,该缓 冲区用来寄存在recv函数接收到的数目;第八个参数指明buf的长短;第多个参数一般置0。这里只描述同步Socket的recv函数的施行流程。当使用 程序调用recv函数时,recv先等待s的发送缓冲中的数据被合同传送完结,假若协商在传送s的出殡和埋葬缓冲中的数据时出现网络错误,那么recv函数重返SOCKET_E凯雷德RODisco Volante,假如s的发送缓冲中从未数据如故数额被合同成功发送实现后,recv先检查套接字s的接收缓冲区,假诺s接收缓冲区中尚无数据 恐怕左券正在接收数据,那么recv就一贯守候,只到和睦把数量接受实现。当左券把多少接收完成,recv函数就把s的收到缓冲中的数据copy到buf 中(注意协议接收到的数码只怕大于buf的长度,所以在这种场合下要调用三回recv函数工夫把s的收受缓冲中的数据copy完。recv函数仅仅是 copy数据,真正的接收数据是切磋来成功的),recv函数重返其实际copy的字节数。要是recv在copy时出错,那么它回到 SOCKET_EHighlanderRO牧马人;假设recv函数在等候公约接收数据时网络中断了,那么它再次回到0。
留心:在Unix系统下,假设recv函数在等候左券接收数据时互连网断开了,那么调用recv的进程会收下到多少个SIGPIPE数字信号,进度对该信号的默许管理是经过终止。

六、recv函数
int recv(
SOCKET s,
char FAR *buf,
int len,
int flags
);
不 论是顾客依然服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的首先个参数钦赐接收端套接字描述符;第一个参数指宾博(Karicare)个缓冲区,该缓 冲区用来贮存在recv函数接收到的多少;第多个参数指明buf的尺寸;第八个参数一般置0。这里只描述同步Socket的recv函数的实施流程。当使用 程序调用recv函数时,recv先等待s的出殡缓冲中的数据被合同传送实现,若是协商在传送s的发送缓冲中的数据时出现互连网错误,那么recv函数返回SOCKET_E本田CR-VRO普拉多,如若s的出殡缓冲中平昔不数量依然数额被合同成功发送完成后,recv先检查套接字s的接收缓冲区,若是s接收缓冲区中未有数据 或然协议正在接收数据,那么recv就直接守候,只到和谐把多少接受完成。当协议把数据接收实现,recv函数就把s的吸收接纳缓冲中的数据copy到buf 中(注意合同接收到的多寡大概大于buf的长短,所以在这种情状下要调用一次recv函数才干把s的接收缓冲中的数据copy完。recv函数仅仅是 copy数据,真正的接收数据是说道来形成的),recv函数再次来到其实际copy的字节数。要是recv在copy时出错,那么它回到 SOCKET_E奥迪Q5RO卡宴;如若recv函数在守候左券接收数据时互联网中断了,那么它重临0。
只顾:在Unix系统下,假如recv函数在守候合同接收数据时互联网断开了,那么调用recv的经过会抽出到贰个SIGPIPE能量信号,进度对该频域信号的暗中同意管理是经过终止。

function GetSmsParams(var SendSmsCnt, HaveNotSendCnt, ReciveSmsCnt,
HaveNotReadSmsCnt: integer): integer; stdcall;
函数表明:
赢得平台的连带参数
参数表达:
SendSmsCnt 发件箱的总短信数
HaveNotSendCnt 未发的短信数量
ReciveSmsCnt 收件箱中已接到短信的数目
HaveNotReadSmsCnt 未读短信的多少

except
result := false;
ExitThread;
end;

七、bind函数
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
当 成立了三个Socket以后,套接字数据结构中有八个默许的IP地址和默许的端口号。三个服务程序必需调用bind函数来给其绑定一个IP地址和叁个特定 的端口号。客商程序一般不要调用bind函数来为其Socket绑定IP地址和断口号。该函数的第多个参数钦命待绑定的Socket描述符;第贰个参数内定三个sockaddr结构,该组织是这么定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
sa_family钦赐地址族,对于TCP/IP左券族的套接字,给其置AF_INET。当对TCP/IP合同族的套接字进行绑定时,大家平常使用另三个地点结构:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
其 中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中独有贰个独一的字段s_addr,表示IP地址,该字段 是一个寸头,一般用函数inet_addr()把字符串方式的IP地址转变到unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机,至少有四个网卡,那么运维在这么的服务器上的服务程序在为其Socket绑定IP地址时 能够把htonl(INADDENVISION_ANY)置给s_addr,这样做的补益是随意哪个网段上的顾客程序都能与该服务程序通讯;假如只给运营在多宿主机上的 服务程序的Socket绑定多个稳固的IP地址,那么就唯有与该IP地址处于同二个网段上的客商程序才具与该服务程序通讯。大家用0来填充 sin_zero数组,指标是让sockaddr_in结构的轻重缓急与sockaddr结构的大大小小同样。上面是叁个bind函数调用的例证:
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr));

七、bind函数
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
当 创立了多少个Socket以往,套接字数据结构中有二个暗许的IP地址和暗中认可的端口号。三个服务程序必得调用bind函数来给其绑定二个IP地址和多个特定 的端口号。客户程序一般不要调用bind函数来为其Socket绑定IP地址和断口号。该函数的第两个参数钦赐待绑定的Socket描述符;第4个参数钦赐一个sockaddr结构,该组织是那样定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
sa_family钦命地址族,对于TCP/IP公约族的套接字,给其置AF_INET。当对TCP/IP合同族的套接字实行绑定期,大家一般采纳另一个地址结构:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
其 中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中独有三个独一的字段s_addr,表示IP地址,该字段 是一个大背头,一般用函数inet_addr()把字符串情势的IP地址调换到unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机,至少有五个网卡,那么运转在这样的服务器上的服务程序在为其Socket绑定IP地址时 能够把htonl(INADDLacrosse_ANY)置给s_addr,那样做的裨益是无论哪个网段上的客商程序都能与该服务程序通讯;倘诺只给运维在多宿主机上的 服务程序的Socket绑定二个原则性的IP地址,那么就唯有与该IP地址处于同三个网段上的顾客程序本事与该服务程序通信。我们用0来填充 sin_zero数组,目标是让sockaddr_in结构的轻重缓急与sockaddr结构的轻重缓急同等。下边是二个bind函数调用的事例:
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(ListenSocket,(struct sockaddr *)&saddr,sizeof;

 

end;

八、listen函数
int listen( SOCKET s, int backlog );
服务程序能够调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护二个顾客连接央求队列,该队列最多容纳backlog个客商连接乞求。假设该函数实行成功,则重回0;如若施行破产,则赶回SOCKET_ERROR。

八、listen函数
int listen( SOCKET s, int backlog );
服务程序能够调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将保养八个客户连接供给队列,该队列最多容纳backlog个顾客连接乞求。假使该函数试行成功,则再次回到0;假若实行倒闭,则赶回SOCKET_ERROR。

procedure TFormMain.Button1Click(Sender: TObject);
var
i: integer;
num: integer;
UserIni: TIniFile;
list: tstringlist;
filepath: string;
sr: TSearchRec;
Section, Key: string; { 分别表示 ini 文件的小节与首要字 }
begin
filepath := ExtractFilePath(Application.ExeName);
filepath := filepath + '区组信息.ini';
if not fileExists then
begin
MessageBox(Handle, '服务器列表文件错失', '错误消息', 0);
Exit;
end;
for i := 0 to FormMain.listview1.Items.Count - 1 do
begin
if FormMain.ListView1.Items[i].Checked = True then
begin
num := StrToInt(FormMain.ListView1.Items[i].Caption);
pplayer.ID := pchar(inttostr;
pplayer.GameHwnd := 0;
pplayer.ClientHwnd := self.Handle;
pplayer.Account := pchar(FormMain.ListView1.Items[i].SubItems[0]);
pplayer.PassWord := pchar(FormMain.ListView1.Items[i].SubItems[1]);
pplayer.RealmName_1 := pchar(FormMain.ListView1.Items[i].SubItems[2]);
pplayer.RealmName_2 := pchar(FormMain.ListView1.Items[i].SubItems[3]);
pplayer.playername := pchar(FormMain.ListView1.Items[i].SubItems[4]);
pplayer.Team:= pchar(FormMain.ListView1.Items[i].SubItems[5]);
pplayer.task:= pchar(FormMain.ListView1.Items[i].SubItems[9]);
pplayer.Gamepath:=pchar(formmain.Edit游戏路径.text);
//根据服务器列表设置
UserIni := TIniFile.Create;
// 判定文件大小
if FindFirst(filepath, faAnyFile, sr) = 0 then
begin
if sr.size > 0 then
begin
// 借使文件不为空
section:='DES';
key:=pplayer.RealmName_1;
pplayer.CmdCode:=pchar(userini.ReadString(section,key,''));

九、accept函数
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
服 务程序调用accept函数从处于监听状态的流套接字s的客商连接央求队列中收取排在最前的叁个顾客央求,并且创办二个新的套接字来与客商套接字创设连接 通道,如若连接成功,就赶回新创设的套接字的描述符,现在与客商套接字沟通数据的是新成立的套接字;假诺战败就再次回到INVALID_SOCKET。该函数 的率先个参数内定处于监听状态的流套接字;操作系统利用第二个参数来回到连接客商的地方结构;操作系统利用第三个参数来回到地址结构addr的尺寸。上边是二个调用accept的例证:
struct sockaddr_in ServerSocketAddr;
int addrlen;
addrlen=sizeof(ServerSocketAddr);
ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen);

九、accept函数
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
服 务程序调用accept函数从处于监听状态的流套接字s的客商连接乞请队列中收取排在最前的三个顾客央浼,并且成立贰个新的套接字来与客商套接字创建连接 通道,假诺连接成功,就回到新创设的套接字的描述符,以往与客商套接字调换数据的是新创造的套接字;假使失败就回来INVALID_SOCKET。该函数 的首先个参数钦命处于监听状态的流套接字;操作系统利用第四个参数来回到连接客户的地方结构;操作系统利用第八个参数来回到地址结构addr的尺寸。上边是叁个调用accept的例证:
struct sockaddr_in ServerSocketAddr;
int addrlen;
addrlen=sizeof(ServerSocketAddr);
ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen);

 end else begin MessageBox(Handle, '服务器列表文件丢失', '错误信息', 0); FindClose; if UserIni <> nil then begin UserIni.Free; UserIni := nil; end; Exit; end; end; //关闭由FindFirstFile函数创建的一个搜索句柄 FindClose; if UserIni <> nil then begin UserIni.Free; UserIni := nil; end; hthread := createthread(nil, 0, @LoginGame, @pplayer, 0, threadid); if WaitForSingleObject(T_Event, INFINITE) = WAIT_OBJECT_0 then ResetEvent; //设置为未触发 CloseHandle; end;end;

十、connect函数
int connect(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
顾客程序调用connect函数来使客商Socket s与监听于name所内定的Computer的一定端口上的服务Socket进行连接。借使总是成功,connect重临0;要是战败则赶回SOCKET_E科雷傲RO猎豹CS6。上面是叁个事例:
struct sockaddr_in daddr;
memset((void *)&daddr,0,sizeof(daddr));
daddr.sin_family=AF_INET;
daddr.sin_port=htons(8888);
daddr.sin_addr.s_addr=inet_addr("133.197.22.4");
connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr));

十、connect函数
int connect(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
客商程序调用connect函数来使顾客Socket s与监听于name所钦点的计算机的一定端口上的劳务Socket举办接二连三。如若连接成功,connect再次来到0;假诺失败则赶回SOCKET_E途锐ROEnclave。上面是八个例子:
struct sockaddr_in daddr;
memset&daddr,0,sizeof;
daddr.sin_family=AF_INET;
daddr.sin_port=htons;
daddr.sin_addr.s_addr=inet_addr("133.197.22.4");
connect(ClientSocket,(struct sockaddr *)&daddr,sizeof;

end;

MessageBox对话框是相比较常用的八个音信对话框,其不但能够定义展现的音信内容、信息提示图标,并且可以定义按键组合及对话框的标题,是一个功效齐全的新闻对话框消息提醒Logo,何况能够定义按键组合及对话框的题目,是二个功效齐全的新闻对框。
 1、函数原型及参数
 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer;
 hWnd:对话框父窗口句柄,对话框展现在Delphi窗体内,可接纳窗体的Handle属性,不然可用0,使其平昔作为桌面窗口的子窗口。
 Text:欲展现的新闻字符串。
 Caption:对话框标题字符串。
 Type:对话框类型常量。
 该函数的重临值为整数,用于对话框开关的识别。
 2、类型常量
 对话框的品类常量可由按键组合、缺省开关、展现Logo、运营情势多种常量组合而成。
 (1)开关组合常量
 MB_OK = $00000000;         //贰个鲜明开关
 MB_OKCANCEL = $00000001;      //一个规定按键,八个撤消按键
 MB_ABORTRET奥迪Q7YIGNORE = $00000002;  //一个不行终止开关,二个重试开关,一个不经意开关
 MB_YESNOCANCEL = $00000003;     //一个是开关,二个否按键,贰个撤回开关
 MB_YESNO = $00000004;        //贰个是开关,贰个否开关
 MB_RETEnclaveYCANCEL = $00000005;     //二个重试开关,多个撤回开关
 (2)缺省按键常量
 MB_DEFBUTTON1 = $00000000;     //第三个开关为缺省开关
 MB_DEFBUTTON2 = $00000100;     //第四个按键为缺省开关
 MB_DEFBUTTON3 = $00000200;     //第多个按键为缺省开关
 MB_DEFBUTTON4 = $00000300;     //第多少个按键为缺省按键
 (3)Logo常量
 MB_ICONHAND = $00000010;        //“×”号图标
 MB_ICONQUESTION = $00000020;      //“?”号图标
 MB_ICONEXCLAMATION = $00000030;    //“!”号图标
 MB_ICONASTERISK = $00000040;      //“i”图标
 MB_USEPAJEROICON = $00000080;        //客户Logo
 MB_ICONWARNING = MB_ICONEXCLAMATION;  //“!”号图标
 MB_ICONERROR = MB_ICONHAND;      //“×”号图标
 MB_ICONINFORMATION = MB_ICONASTERISK; //“i”图标
 MB_ICONSTOP = MB_ICONHAND;       //“×”号图标
 (4)运转方式常量
 MB_应用程式LMODAL = $00000000;    //应用程序情势,在未完工对话框前也能切换来另一应用程序
 MB_SYSTEMMODAL = $0000一千;   //系统方式,必须终止对话框后,工夫做其它操作
 MB_TASKMODAL = $0000贰仟;    //职务形式,在未终止对话框前也能切换成另一应用程序
 MB_HELP = $00004000;       //Help Button
 3、函数重回值
 0            //对话框建构失利
 idOk = 1        //按分明按钮
 idCancel = 2      //按撤除开关
 idAbout = 3       //按万分终止按键
 idRetry = 4       //按重试开关
 idIgnore = 5      //按忽略开关
 idYes = 6        //按是按键
 idNo = 7        //按否开关

MessageBox对话框是相比常用的一个消息对话框,其不但能够定义突显的音讯内容、音信提醒Logo,何况能够定义按键组合及对话框的标题,是二个功效齐全的音信对话框音讯提示Logo,何况能够定义开关组合及对话框的题目,是三个功效齐全的新闻对框。
 1、函数原型及参数
 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer;
 hWnd:对话框父窗口句柄,对话框展现在Delphi窗体内,可利用窗体的Handle属性,不然可用0,使其平素作为桌面窗口的子窗口。
 Text:欲展现的信息字符串。
 Caption:对话框标题字符串。
 Type:对话框类型常量。
 该函数的重回值为整数,用于对话框按键的鉴定识别。
 2、类型常量
 对话框的档案的次序常量可由开关组合、缺省按键、展现Logo、运维情势种种常量组合而成。
 按键组合常量
 MB_OK = $00000000;         //三个鲜明开关
 MB_OKCANCEL = $00000001;      //二个规定按键,二个撤废开关
 MB_ABORTRET途睿欧YIGNORE = $00000002;  //多少个格外终止开关,一个重试开关,二个忽视按键
 MB_YESNOCANCEL = $00000003;     //四个是按键,三个否开关,二个注销开关
 MB_YESNO = $00000004;        //一个是开关,三个否开关
 MB_RET途胜YCANCEL = $00000005;     //叁个重试按键,三个撤回按键
 缺省开关常量
 MB_DEFBUTTON1 = $00000000;     //第一个开关为缺省按键
 MB_DEFBUTTON2 = $00000100;     //第贰个按键为缺省按键
 MB_DEFBUTTON3 = $00000200;     //第四个按键为缺省开关
 MB_DEFBUTTON4 = $00000300;     //第多少个按键为缺省按键
 Logo常量
 MB_ICONHAND = $00000010;        //“×”号图标
 MB_ICONQUESTION = $00000020;      //“?”号图标
 MB_ICONEXCLAMATION = $00000030;    //“!”号图标
 MB_ICONASTERISK = $00000040;      //“i”图标
 MB_USEKoleosICON = $00000080;        //客商图标
 MB_ICONWARNING = MB_ICONEXCLAMATION;  //“!”号图标
 MB_ICONERROR = MB_ICONHAND;      //“×”号图标
 MB_ICONINFORMATION = MB_ICONASTERISK; //“i”图标
 MB_ICONSTOP = MB_ICONHAND;       //“×”号图标
 运营情势常量
 MB_APPLMODAL = $00000000;    //应用程序情势,在未甘休对话框前也能切换成另一应用程序
 MB_SYSTEMMODAL = $0000一千;   //系统格局,必得终止对话框后,本事做任何操作
 MB_TASKMODAL = $00003000;    //职分格局,在未告竣对话框前也能切换来另一应用程序
 MB_HELP = $00004000;       //Help Button
 3、函数再次回到值
 0            //对话框创设战败
 idOk = 1        //按鲜明按键
 idCancel = 2      //按撤消按键
 idAbout = 3       //按极度终止按键
 idRetry = 4       //按重试按键
 idIgnore = 5      //按忽略开关
 idYes = 6        //按是按键
 idNo = 7        //按否按键

不亮堂为何,logingame线程,传递的自定义结构体参数过多,会传送不准确,何况里面有注释的地方会断点无效,运维起来会自行跳过这段代码,求大神解救,多谢。。

◇[DELPHI]调换函数的概念及表达
datetimetofiledate (datetime:Tdatetime):longint; 将Tdatetime格式的日期时间值转变到DOS格式的日未时间值
datetimetostr (datetime:Tdatetime):string; 将Tdatatime格式变量转换到字符串,若是datetime参数不满含日期值,重回字符串日期展现成为00/00/00,假使datetime参数 中一贯不常间值,重临字符串中的时间有个别显得成为00:00:00 AM
datetimetostring (var result string;
const format:string;
datetime:Tdatetime); 依据给定的格式字符串调换时间和日期值,result为结果字符串,format为转移格式字符串,datetime为日期时间值
datetostr (date:Tdatetime) 使用shortdateformat全局变量定义的格式字符串将date参数调换来对应的字符串
floattodecimal (var result:Tfloatrec;value:
extended;precision,decimals:
integer); 将浮点数转变到十进制表示
floattostr (value:extended):string 将浮点数value转变到字符串格式,该调换使用普通数字格式,调换的有效位数为14个人。
floattotext (buffer:pchar;value:extended;
format:Tfloatformat;precision,
digits:integer):integer; 用给定的格式、精度和小数将浮点值value调换到十进制表示方式,转变结果寄存于buffer参数中,函数重返值为存款和储蓄到buffer中的字符位数,buffer是非0结果的字符串缓冲区。
floattotextfmt (buffer:pchar;value:extended;
format:pchar):integer 用给定的格式将浮点值value转变来十进制表示情势,转变结果寄存于buffer参数中,函数重临值为存款和储蓄到buffer中的字符位数。
inttohex (value:longint;digits:integer):
string; 将给定的数值value调换到十六进制的字符串。参数digits给出调换结果字符串包含的数字位数。
inttostr (value:longint):string 将整数转变到十进制方式字符串
strtodate (const S:string):Tdatetime 将字符串调换到日期值,S必需满含二个官方的格式日期的字符串。
strtodatetime (const S:string):Tdatetime 将字符串S调换来日期时间格式,S必需具备MM/DD/YY HH:MM:SS[AM|PM]格式,个中国和东瀛期和岁月相隔符与系统时代时间常量设置相关。若无内定AM或PM消息,表示使用24小时制。
strtofloat (const S:string):extended; 将给定的字符串转换来浮点数,字符串具备如下格式:
[+|-]nnn…[.]nnn…[<+|-><E|e><+|->nnnn]
strtoint (const S:string):longint 将数字字符串转变来整数,字符串能够是十进制或十六进制格式,倘若字符串不是三个法定的数字字符串,系统发生ECONVERTECRUISERRO瑞鹰卓殊
strtointdef (const S:string;default:
longint):longint; 将字符串S转换到数字,假设不能够将S调换来数字,strtointdef函数重返参数default的值。
strtotime (const S:string):Tdatetime 将字符串S转变到TDATETIME值,S具有HH:MM:SS[AM|PM]格式,实际的格式与系统的时光相关的全局变量有关。
timetostr (time:Tdatetime):string; 将参数TIME转变到字符串。调换结果字符串的格式与系统的小时相关常量的装置有关。

◇[DELPHI]改造函数的定义及申明
datetimetofiledate (datetime:Tdatetime):longint; 将Tdatetime格式的日牛时间值转变来DOS格式的日期时间值
datetimetostr (datetime:Tdatetime):string; 将Tdatatime格式变量调换来字符串,倘若datetime参数不带有日期值,再次回到字符串日期显示成为00/00/00,假如datetime参数 中尚无时间值,重返字符串中的时间部分显得成为00:00:00 AM
datetimetostring (var result string;
const format:string;
datetime:Tdatetime); 依据给定的格式字符串调换时间和日期值,result为结果字符串,format为转移格式字符串,datetime为日期时间值
datetostr (date:Tdatetime) 使用shortdateformat全局变量定义的格式字符串将date参数转变来对应的字符串
floattodecimal (var result:Tfloatrec;value:
extended;precision,decimals:
integer); 将浮点数调换来十进制表示
floattostr (value:extended):string 将浮点数value调换到字符串格式,该转变使用普通数字格式,转变的有效位数为拾二位。
floattotext (buffer:pchar;value:extended;
format:Tfloatformat;precision,
digits:integer):integer; 用给定的格式、精度和小数将浮点值value转换来十进制表示情势,调换结果存放于buffer参数中,函数再次回到值为存款和储蓄到buffer中的字符位数,buffer是非0结果的字符串缓冲区。
floattotextfmt (buffer:pchar;value:extended;
format:pchar):integer 用给定的格式将浮点值value转变到十进制表示方式,转变结果寄存于buffer参数中,函数重回值为存款和储蓄到buffer中的字符位数。
inttohex (value:longint;digits:integer):
string; 将给定的数值value转换来十六进制的字符串。参数digits给出转换结果字符串包括的数字位数。
inttostr (value:longint):string 将整数转换来十进制情势字符串
strtodate (const S:string):Tdatetime 将字符串转变来日期值,S必得包涵一个法定的格式日期的字符串。
strtodatetime (const S:string):Tdatetime 将字符串S调换到日期时间格式,S必须具备MM/DD/YY HH:MM:SS[AM|PM]格式,个中国和东瀛期和岁月相隔符与系统时代时间常量设置相关。若无钦点AM或PM新闻,表示使用24小时制。
strtofloat (const S:string):extended; 将给定的字符串调换来浮点数,字符串具备如下格式:
[+|-]nnn…[.]nnn…[<+|-><E|e><+|->nnnn]
strtoint (const S:string):longint 将数字字符串调换到整数,字符串能够是十进制或十六进制格式,要是字符串不是三个合法的数字字符串,系统爆发ECONVERTE昂科威RO奥迪Q5卓殊
strtointdef (const S:string;default:
longint):longint; 将字符串S转变来数字,要是无法将S转变来数字,strtointdef函数重返参数default的值。
strtotime (const S:string):Tdatetime 将字符串S转变来TDATETIME值,S具备HH:MM:SS[AM|PM]格式,实际的格式与系统的光阴相关的全局变量有关。
timetostr (time:Tdatetime):string; 将参数TIME转变来字符串。调换结果字符串的格式与系统的岁月相关常量的安装有关。

unit net;

unit net;

interface
  uses
      sysutils
     ,windows
     ,dialogs
     ,winsock
     ,classes
     ,comobj
     ,wininet;

interface
uses
sysutils
,windows
,dialogs
,winsock
,classes
,comobj
,wininet;

本文由必威发布于必威-数据,转载请注明出处:此短信平台

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。