TServerSocket和TClientSocket的问题(100分)

  • 主题发起人 主题发起人 cowboy1999
  • 开始时间 开始时间
C

cowboy1999

Unregistered / Unconfirmed
GUEST, unregistred user!
用上述两个控件编写了客户端后,建立连接后,服务器向服务器发送了一个数据,客户端也成功收到,这时客户端不能断开连接,一断开,服务器就报10053错误,客户端出了接收数据外,什么工作也没做。以为是服务器的错误,后来用delphi自带的demo做服务器端,也有这个问题;以为是控件的问题,用Winsock API做了个客户端,也是一样的错误;以为是机器环境的问题,拿到别的机器上试,也是一样?请问大家碰见过这种问题吗?怎么解决的?
 
你在OnError事件里ErrorCode:=0就可以避免这个问题
 
看看这里:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1966489
 
如果在OnError事件里设置ErrorCode := 0;那么OnClientDisconnect事件就不会触发啊!
我用另外一个Tcp Udp调试器,服务器就不会报错!。
 
10053:
Errmsg:='软件导致连接退出';
这是在服务器端和客户端不能断开时,以外中断,或者通过调试时中断出现的提示错误
 
能否貼出斷開操作源碼﹖
 
服务器端用delphi6的demo: /Internet/chat
客户端源代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Winsock, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function testFunc(): Integer;
function InitWSA:boolean;
function FinalizeWSA:boolean;

var
Form1: TForm1;

implementation

{$R *.dfm}
function testFunc(): Integer;
var
port: Integer;
aSocket: TSocket;
local,recipient: sockaddr_in; //接收方地址结构
sendBuffer: array [1..1024] of byte;
nSendPos: Integer;
recvBuffer: array[1..1024] of byte;
nPos: Integer;
nSeqNum: Integer;
ret: Integer;
lastTime, nowTime: Cardinal;
readfds: PFDSet;
TimeInterval: PTimeVal;
sa: sockaddr_in;
begin
result := -1;
if not(InitWSA) then exit;
aSocket := Socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
recipient.sin_family := AF_INET; //协议族
recipient.sin_port := htons(WORD(6000)); //端口
recipient.sin_addr.S_addr := inet_addr(PChar('192.168.1.15')); //IP地址
//local.sin_family := AF_INET;
//local.sin_port := htons(WORD(4455));
//local.sin_addr.S_addr := inet_addr(PChar('192.168.1.15'));
if connect(aSocket, recipient, sizeof(recipient))<>0 then
begin
FinalizeWSA();
exit;
end;
//阻塞等待Agent的回应
new(readfds); //创建一个可读的等待套接字描述符集合
FD_ZERO(readfds^);
FD_SET(aSocket,readfds^);
ret := select(aSocket+1,readfds,nil,nil,nil);
closesocket(aSocket);
end;

//初始化,Socket版本协商,出错返回false;
function InitWSA:boolean;
var
aWSAData: TWSAData;
wVersionRequested: WORD;
err: Integer;
begin
wVersionRequested := MAKEWORD(1,1); //协商版本号,使用1.1版本.
err := WSAStartup(wVersionRequested,aWSAData);
if err <>0 then
begin
ShowMessage('错误:不能启动winsock动态连接库!');
result := false;
exit;
end;
//确保windows socket DLL支持1.1;
if ((LOBYTE(aWSAData.wVersion)<>1) or (HIBYTE(aWSAData.wVersion)<>1)) then
begin
ShowMessage('错误:没有对应的DLL!');
result := false;
exit;
end;
result := true;
end;

//Socket最终化,清除Winsock动态连接库,成功返回true,失败返回false
function FinalizeWSA:boolean;
begin
if WSACleanup<>0 then result := false
else result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
testFunc();
end;

end.
 
后退
顶部