关于网友提出的“ TClientSocket 10053的问题”问题疑问,本网通过在网上对“ TClientSocket 10053的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: TClientSocket 10053的问题
描述: 服务端是在AIX下的C程序
客户端利用DElphi的TClientSocket。
InitEpost的时候先获取目标端口,然后在CallEPost的时候利用目标端口建立新链接。
现在的情况是进行多次连续的InitEpost和CallEPost就会出现10053的错误。
且都有可能发生在上述两个函数中,在CSRead中收不到数据,已确认服务端已经发送了数据。
关闭了防火墙之类也同样出现10053.onError的时候置ErrorCode:=0,虽然不会跳出错误窗口,但是收不到数据,无法进行业务逻辑处理。
请求帮助.......
procedure TPost.CSConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
F_Status := ssOpen;
end;
procedure TPost.CSError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
//ErrorCode := 0;
F_Status := ssError;
end;
procedure TPost.CSRead(Sender: TObject; Socket: TCustomWinSocket);
var
Str: String;
//RecvLen: Integer;
begin
try
if Socket.ReceiveLength > 0 then
begin
//F_LastRecv:= GetTickCount;
F_Status := ssReading;
Str := Socket.ReceiveText;
SetData(Str);//对收到的报文处理,init的时候获取端口号,call的时候获取接收报文
end;
except
on E: Exception do
begin
//F_ProcInfo.SysLogs.WriteLog(ltError, '线程内发生错误,错误原因:' + E.Message);
//F_ProcInfo.SysDiscard := True;
end;
end;
end;
function TPost.InitEPost: Boolean;
var
CSocket: TClientSocket;
TickStart, TimeOut: cardinal;
begin
Result := False;
try
// 建立连接
CSocket := TClientSocket.Create(nil);
F_Status := ssClose;
//CSocket.Active := False;
CSocket.Host := '192.168.1.50';//g_Ini.Tuxedo_IP;
CSocket.Port := 8530;//g_Cfg.Ini.Tuxedo_Port;
CSocket.ClientType := ctNonBlocking;
CSocket.OnConnect := CSConnect;
CSocket.OnError := CSError;
CSocket.OnRead := CSRead;
//CSocket.Active := True;
CSocket.Open;
// 等待连接成功
TickStart := GetTickCount;
while F_Status = ssClose do
begin
Application.ProcessMessages;
//Sleep(20);
//等待连接超时设置
{if GetTickCount - TickStart > g_Ini.TimeOut then
begin
Result := False;
Exit;
end;}
end;
if F_Status = ssOpen then
begin
F_Status := ssSend;
CSocket.Socket.SendText(g_Cfg.AddSpace(' ',64));
//SendMessage(CSocket.Socket,g_Cfg.AddSpace(' ',64),'');
end;
//TickStart := GetTickCount;
while F_Status = ssSend do
begin
Application.ProcessMessages;
//Sleep(20);
//等待连接超时设置
{if GetTickCount - TickStart > g_Ini.TimeOut then
begin
Result := False;
Exit;
end;}
end;
//TickStart := GetTickCount;
while F_Status = ssReading do
begin
Application.ProcessMessages;
//Sleep(20);
//等待连接超时设置
{if GetTickCount - TickStart > g_Ini.TimeOut then
begin
Result := False;
Exit;
end;}
end;
if F_Status = ssError then
begin
Result := False;
Exit;
end;
Result := True;
CSocket.Socket.Close;
CSocket.Close;
finally
CSocket.Free;
end;
end;
function TPost.CallEPost(Head, Body: String; Server: String; var RCode: Integer; var RStr: String): Boolean;
var
CSocket: TClientSocket;
TickStart, TimeOut: cardinal;
begin
Result := False;
Application.ProcessMessages;
RCode := -1;
try
// 建立连接
CSocket := TClientSocket.Create(nil);
F_Status := ssClose;
//CSocket.Active := False;
CSocket.Host := '192.168.1.50';//g_Ini.Tuxedo_IP;
CSocket.Port := distPort;
CSocket.ClientType := ctNonBlocking;
CSocket.OnConnect := CSCOnnect;
CSocket.OnError := CSError;
CSocket.OnRead := CSRead;
//CSocket.Active := True;
CSocket.Open;
// 等待连接成功
TickStart := GetTickCount;
while F_Status = ssClose do
begin
Application.ProcessMessages;
//Sleep(20);
//等待连接超时设置
{if GetTickCount - TickStart > g_Ini.TimeOut then
begin
Result := False;
Exit;
end;}
end;
if F_Status = ssOpen then
begin
F_Status := ssSend;
CSocket.Socket.SendText(Head+Body);
//SendMessage(CSocket.Socket, Head, Body);
end;
TickStart := GetTickCount;
while F_Status = ssSend do
begin
Application.ProcessMessages;
//Sleep(20);
//等待连接超时设置
{if GetTickCount - TickStart > g_Ini.TimeOut then
begin
Result := False;
Exit;
end;}
end;
TickStart := GetTickCount;
while F_Status = ssReading do
begin
Application.ProcessMessages;
//Sleep(20);
//等待连接超时设置
{if GetTickCount - TickStart > g_Ini.TimeOut then
begin
Result := False;
Exit;
end;}
end;
if F_Status = ssError then
begin
Result := False;
Exit;
end;
RCode := 0;
RStr := F_RHead + F_RBody;
Result := True;
CSocket.Socket.Close;
CSocket.Close;
finally
CSocket.Free;
end;
end;
解决方案1: 那可能和tclientsocket无关了,而和变量的调用,定义等相关。
自己慢慢调试吧,闷头调试比这里解决问题快。
解决方案2: 几个建议:
1. 按目前的代码所实现的同步处理的原理, InitEpost和CallEPost这两个函数, 不能出现某个时刻同时被调用,或者某个函数被调用两次或以上。检查一下程序在这方面有没有什么问题。
2. 检查一下服务端的程序在处理同时的多个客户端连接时,是否有问题。
3. ErrorCode := 0; 这个语句还是要的, 后面再跟上 Socket.Close;
以上介绍了“ TClientSocket 10053的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3697529.html