Window Socket API function Error
当socket函数出现错误时,一般都会raise这些异常,
所以在对ClientSocket.Socket.Proc/ Func 加上try,应该可以捕获。
Code := WinSock.send(FSocket, Buf, Len, 0) ;
if Code <> SOCKET_ERROR then
begin
Code :=WSAGetLastError;
raise Exception.CreateFmt('Windows socket error: %s (%d), on API ''%s''',[SysErrorMessage(Code), Code,'send' );
end;
const
WSABASEERR = 10000
WSAECONNABORTED = (WSABASEERR+53);
WSAECONNRESET = (WSABASEERR+54);
当socket函数出现错误时,一般都会raise这些异常,
所以在对ClientSocket.Socket.Proc/ Func 加上try,应该可以捕获。
Code := WinSock.send(FSocket, Buf, Len, 0) ;
if Code <> SOCKET_ERROR then
begin
Code :=WSAGetLastError;
raise Exception.CreateFmt('Windows socket error: %s (%d), on API ''%s''',[SysErrorMessage(Code), Code,'send' );
end;
const
WSABASEERR = 10000
WSAECONNABORTED = (WSABASEERR+53);
WSAECONNRESET = (WSABASEERR+54);
可是有时还是出现异常,如果两台机器正在通讯,这时一台机器突然宕掉,
这中异常能捕到吗?
这个事件在raise之前。
procedure ClientSocket.OnError
begin
ShowMessage('socket error');
Abort; //中止。
end;
那么,WSAECONNABORTED WSACONNERESET 这两个异常,表示什么含义呢?
换句话说,什么时候被触发呢?
能告诉我你的EMAIL和OICQ吗?谢谢
出现问题也总在采集机,接受端无任何问题
《Windows Sockets 网络程序设计大全》 清华大学出版社 29.50元
对出错得意思有注明。
[email protected]
10054是连接被远程端重启错误
在OnError事件中关闭连接然后重起并将ErrorCode置0,可解决此问题
Error Codes帮助项
各种错误信息全有
捕捉错误:在OnError中
begin
....
ErrorCode:=0; //对于某些错误将不在产生异常
end;
对于一些严重错误,只有修改原代码
在ScktComp定义了全局变量,这个可以由用户来编写Socket的出错处理。
你只要调用scktComp.SetErrorProc(mySocketError);///////////////////////////////////////////////////////////////////////////
//VCL scktComp.pas TSocketErrorProc = procedure (ErrorCode: Integer);threadvar
SocketErrorProc: TSocketErrorProc;function SetErrorProc(ErrorProc: TSocketErrorProc): TSocketErrorProc;
begin
Result := SocketErrorProc;
SocketErrorProc := ErrorProc;
end;//checkSocketResult是scktcomp.pas私有函数,不能调用,
//如果Socket出错,大都分的错误都在这里raise.
function CheckSocketResult(ResultCode: Integer; const Op: string): Integer;
begin
if ResultCode <> 0 then
begin
Result := WSAGetLastError;
if Result <> WSAEWOULDBLOCK then
if Assigned(SocketErrorProc) then //如果用户为写了处理过程,则调用用户的处理过程,不然我就raise Window Socket Error.
SocketErrorProc(Result)
else raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Result), Result, Op]);
end else Result := 0;
end;//////////////////////////////////////////////////////////////////////////
//顺手写个。没调试。
type
tform1 = class(tform)
private
procedure mySocketErrorProc(ErrorCode: Integer);
...
end;procedure TForm1.OnCreate(Sender: TObject);
begin
scktComp.SetErrorProc(mySocketError);
end;//用你的处理过程,来代替VCL的出错过程。---------------------
procedure TForm1.mySocketErrorProc(ErrorCode: Integer);
var
S: string;
begin
S := SysUtils.SysErrorMessage(ErrorCode);
Windows.MessageBox(Handle, PChar(S), 'Socket错误', MB_OK + MB_ICONERROR);
end;
看来大家对WinSock都有比较深刻的研究啊,尤其是copy_paste,这里多谢了,你的代码我
会用心研究的,你的QQ我怎么查不到啊!
我怎么与你联系?
我的QQ:45970397