沧
沧浪之水
Unregistered / Unconfirmed
GUEST, unregistred user!
程序过程如下:
1,客户端,拨号到服务器,
2。服务器用2000建立ras连接,当客户拨号进来以后,用socket传输,服务器socket是多线程
问题如下:
1。下边是在服务器端线程中执行的一段接收文件的程序,但是它不能捕获socket异常错误,如果客户突然断开连接,这个线程立即弹出一个错误框,并且线程会挂起了,怎么去掉这个错误?
2,为了安全,我想在ras中得到客户端拨号过来的电话号码?我该用什么函数?
服务器端线程执行的程序如下:
try
P := NewSocketData; { 有新的客户端建立连接,则为其分配内存用于保存 相关信 息 }
mm.Add('');
mm.Add ('');
mm.Add ('');
mm.Add('');
mm.Add('');
i:=-1;
Synchronize(Log);
while (not Terminated) and ClientSocket.Connected do
begin
ClientSocket.Data:=P;
Verb := vcNone;
Len := ClientSocket.ReceiveBuf(GetBuf, SendLen);
if Len >= LeadLen then begin
ExtractBuf(GetBuf, Len, LeadBuf, DataBuf);
Verb := ExtractVerb(LeadBuf);
if verb=vcLoadInfo then//如果是客户端的文件信息
begin{ 解析文件名,创建文件流,响应文件大小 }
P:=ClientSocket.Data;
Sendsize:=0;
ExtractLoadInfo(DataBuf, P);
//目前P^.dstFileName还保存有刚刚下载的文件名
P^.SrcFileName:=ExtractFilePath(Application.ExeName) + 'receive/'+P^.dstFileName;
P^.DstFileName:=ExtractFilePath(Application.ExeName) + 'send/'+P^.dstFileName;
if FileExists(P^.SrcFileName) then
try{ 检查文件是否存在 }
m_uppath:=trim(ExtractFilePath(P^.SrcFileName));
m_upfname:=trim(ExtractFileName(P^.SrcFileName));
//对文件进行操作并且形成回传文件
P^.dstFileName:=m_downpath;
P^.SrcFileName:=m_downpath;
P^.FS := TFileStream.Create(P^.SrcFileName, fmOpenRead);
P^.FSEnabled := True;
P^.FileSize := P^.FS.Size;
//-------------------------------------
// ProgressBar1.Max := p^.fs.size;
//-------------------------------------
P^.Mode := smLoad;
P^.LeftSize := P^.FS.Size;
MakeVerbBuf(vsLoadInfoOK, SendBuf, SendSize);//这一句可以没有
MakeServerLoadInfoBuf(P, SendBuf, SendSize);
except
MakeVerbBuf(vsFail, SendBuf, SendSize);
end
else begin
MakeVerbBuf(vsFail, SendBuf, SendSize);
end;
end else
ServerEchoForVerb(Verb, DataBuf, Len - LeadLen , SendBuf, SendSize, ClientSocket);
end else begin
SendSize := 0;
end;
if SendSize > 0 then
ClientSocket.SendBuf(SendBuf, SendSize);
S := VerbToString(Verb);
if S <> '' then begin
S := S + ' [' + ClientSocket.RemoteAddress + ']';
//Log(S);
//Log(sDisconnectedOK, Memo1);
//ProgressBar1.Position := 0;
end;
if IsTerminateVerb(Verb) then begin
P := ClientSocket.Data;
ResetSocketData(P);
ClientSocket.Close;
end;
//如果是处理完最后一个包
//if verb=1008 then clientsocket.Close ;
这段程序只是服务器端处理的一部分,如果有人有实质的建议,我可以多给一些分数,关键是第二个问题,急盼回答
1,客户端,拨号到服务器,
2。服务器用2000建立ras连接,当客户拨号进来以后,用socket传输,服务器socket是多线程
问题如下:
1。下边是在服务器端线程中执行的一段接收文件的程序,但是它不能捕获socket异常错误,如果客户突然断开连接,这个线程立即弹出一个错误框,并且线程会挂起了,怎么去掉这个错误?
2,为了安全,我想在ras中得到客户端拨号过来的电话号码?我该用什么函数?
服务器端线程执行的程序如下:
try
P := NewSocketData; { 有新的客户端建立连接,则为其分配内存用于保存 相关信 息 }
mm.Add('');
mm.Add ('');
mm.Add ('');
mm.Add('');
mm.Add('');
i:=-1;
Synchronize(Log);
while (not Terminated) and ClientSocket.Connected do
begin
ClientSocket.Data:=P;
Verb := vcNone;
Len := ClientSocket.ReceiveBuf(GetBuf, SendLen);
if Len >= LeadLen then begin
ExtractBuf(GetBuf, Len, LeadBuf, DataBuf);
Verb := ExtractVerb(LeadBuf);
if verb=vcLoadInfo then//如果是客户端的文件信息
begin{ 解析文件名,创建文件流,响应文件大小 }
P:=ClientSocket.Data;
Sendsize:=0;
ExtractLoadInfo(DataBuf, P);
//目前P^.dstFileName还保存有刚刚下载的文件名
P^.SrcFileName:=ExtractFilePath(Application.ExeName) + 'receive/'+P^.dstFileName;
P^.DstFileName:=ExtractFilePath(Application.ExeName) + 'send/'+P^.dstFileName;
if FileExists(P^.SrcFileName) then
try{ 检查文件是否存在 }
m_uppath:=trim(ExtractFilePath(P^.SrcFileName));
m_upfname:=trim(ExtractFileName(P^.SrcFileName));
//对文件进行操作并且形成回传文件
P^.dstFileName:=m_downpath;
P^.SrcFileName:=m_downpath;
P^.FS := TFileStream.Create(P^.SrcFileName, fmOpenRead);
P^.FSEnabled := True;
P^.FileSize := P^.FS.Size;
//-------------------------------------
// ProgressBar1.Max := p^.fs.size;
//-------------------------------------
P^.Mode := smLoad;
P^.LeftSize := P^.FS.Size;
MakeVerbBuf(vsLoadInfoOK, SendBuf, SendSize);//这一句可以没有
MakeServerLoadInfoBuf(P, SendBuf, SendSize);
except
MakeVerbBuf(vsFail, SendBuf, SendSize);
end
else begin
MakeVerbBuf(vsFail, SendBuf, SendSize);
end;
end else
ServerEchoForVerb(Verb, DataBuf, Len - LeadLen , SendBuf, SendSize, ClientSocket);
end else begin
SendSize := 0;
end;
if SendSize > 0 then
ClientSocket.SendBuf(SendBuf, SendSize);
S := VerbToString(Verb);
if S <> '' then begin
S := S + ' [' + ClientSocket.RemoteAddress + ']';
//Log(S);
//Log(sDisconnectedOK, Memo1);
//ProgressBar1.Position := 0;
end;
if IsTerminateVerb(Verb) then begin
P := ClientSocket.Data;
ResetSocketData(P);
ClientSocket.Close;
end;
//如果是处理完最后一个包
//if verb=1008 then clientsocket.Close ;
这段程序只是服务器端处理的一部分,如果有人有实质的建议,我可以多给一些分数,关键是第二个问题,急盼回答