我的理解是:
ClientSocket.Open() 并不等待连接建立好,而是立即返回.
所以Open 后的代码在第一次运行时连接一般还没有建立好,因此不能发送数据.
而你响应showmessage至少要用一两秒时间,此时连接一般已经建立好,故可以
发送数据.
连接建立好之后ClientSocket.OnClientWrite()会被调用,你不妨在此发送你
的第一个数据包.
ClientSocket.Open() 并不等待连接建立好,而是立即返回.
所以Open 后的代码在第一次运行时连接一般还没有建立好,因此不能发送数据.
而你响应showmessage至少要用一两秒时间,此时连接一般已经建立好,故可以
发送数据.
连接建立好之后ClientSocket.OnClientWrite()会被调用,你不妨在此发送你
的第一个数据包.
感谢你的回答。
还是有问题,我去掉ShowMessage后,加上了Sleep(1000);这样的话就出现100054错误,不能发数据。
你说的调用在哪里呢?我Open后,就开始SendText了!
还有我写的 ClientSocket:=TClientSocket.Create(nil) 注意这个nil,我不知道这样对不对?有没有什么问题?(在dll中,没有Form)
谢了!
我在水木清华上看到也有一篇类似的文章,他指出是由于没有工作模式,但还提到消息机制,不知如何理解?sunsetyang你也不妨去看看,有什么好的建议一定要赐教啊!呵呵!谢了!
只是你必须在退出时手工Free.
如何动态的写OnConnect事件呢? 还有设置完CbNoBlocking后,如何处理Hook?
procedure MySocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MySocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MySocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MySocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure MySocketRead(Sender: TObject; Socket: TCustomWinSocket);Create你的ClientSocket时
ClientSocket:= TClientSocket.Create(nil);
ClientSocket.Address := YourServiceIP;
ClientSocket.OnConnect := MySocketConnect;
ClientSocket.OnDisconnect := MySocketDisConnect;
ClientSocket.OnError := MySocketError;
ClientSocket.OnRead := MySocketRead;
ClientSocket.Active := TRUE;
bConnected := FALSE;然后在你的
procedure MySocketConnect中令 bConnected := TRUE;发送数据时判断bConnected即可。注意在procedure MySocketError 中要将ErrorCode:=0;
Good Luck!!
问题是我在Dll中,没有Form,有Form的话就简单啦!
在它Create时做上面的初始化工作!
如果还有问题email to: [email protected]