请教一下TClientSocket的问题,请各位高手帮忙(40分)

  • 主题发起人 主题发起人 tscc
  • 开始时间 开始时间
我刚才找到安全设置TClientSocket本机端口的办法了,代码如下:应该说这个是
最安全的办法。
procedure TForm1.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
var
SockAddrIn: TSockAddrIn;
iRc:Integer;
begin
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.S_addr := 0;
SockAddrIn.sin_port := htons(1979);
iRc:=bind(ClientSocket1.Socket.SocketHandle, SockAddrIn, sizeof(TSockAddrIn));
if iRc= 0 then
ShowMessage('绑定成功!')
else
ShowMessage(Format('%d',[WSAGetLastError()]));
 
张无忌兄弟的办法是对的,没想到这个被我遗忘的事件竟是如此有用,看来VCL为我们封闭了太多的东西反而不是一件好事。
我仔细查看了VCL源码,发现我的方法的确存在问题,我将ClientSocket改成阻塞方式后就不行了,我想可能的原因是在异步方式下,Open以后Socket并未连接到服务端,但是已经建立了Socket实例,因此紧接着调用bind可以修改本地端口,这种方法不可靠。VCL里面Open方法调用了很多过程,如果要指定本地端口,可以修改InitSocket(初始化同步Socket)和AnsycSocket(初始化异步Socket),不过动VCL的事我可不干:)
 
非常感谢各位的帮忙
 
多人接受答案了。
 
后退
顶部