SOCKET 编程请教 (200分)

  • 主题发起人 主题发起人 kingfisher
  • 开始时间 开始时间
K

kingfisher

Unregistered / Unconfirmed
GUEST, unregistred user!
prnclientsocket:=TClientsocket.create(self);
prnclientsocket.Port:=1024;
prnclientsocket.Host:='pc';
prnclientsocket.Open;
prnclientsocket.Socket.SendText('asd');
这段代码放在同一过程时服务器端只接受到客户方的连接,没有接受到数据
(字符串'asd')
在OPEN 与SENDTEXT 之间延时也不行
而前四行代码与最后一行代码分别放在两个BUTTONCLICK事件过程里则可以正确接受.

分析的原因是因为open需要时间,而我使用的是非阻塞情况,
但是我检查active属性 若为否定那么就延时
再检查,如此循环 直至属性为真
可实际运行时发现死循环了 这样做不行
请问非阻塞的情况下怎么处理。

若为阻塞情况就没有这个问题了
但是阻塞时 若服务器方没有启动监听,那么就出错,
而且出错不跳转到onerror事件处理过程中
请问阻塞情况下怎么处理出错情况


还有若客户方的SOCKET发送接受是放在一个单独的线程内的,
那么事件处理过程例如onconnect跳转进入
这是因为事件处理需要消息触发,而线程不能接受消息的原因吗
我的这个概念是否对?请教




 
我以前做的时候,将需发送的文本放在一个TStringList中,需要的时候再发送
 
>>但是我检查active属性 若为否定那么就延时
>>再检查,如此循环 直至属性为真
>>可实际运行时发现死循环了
照说是可以的。你是怎么实现循环的?
有没有在循环中加入Application.ProcessMessage?
 
实现循环的代码:
prnclientsocket:=TClientsocket.create(self);
prnclientsocket.Port:=1024;
prnclientsocket.Host:='pc';
prnclientsocket.Open;
while prnclientsocket.active<>true do
begin
sleep(100);
end;
prnclientsocket.Socket.SendText('asd');
这样不行吗 为什么要加processmessage
 
不可以使用sleep(100),因为它挂起了处理器,不再执行任何动作,当然就死循环了。你使用其他方法来延时吧。比如application.processmessage.
 
我也遇到此问题,关注!
 
你这样做是为了实现什么功能
非阻塞模式下 最好在事件中进行发送和接受
我觉得有些奇怪的是 我看了一下源代码
prnclientsocket.Open --->实际上就直接把active 设置为真 并没有做其它事情
>>阻塞情况下怎么处理出错情况 //必须使用异常来处理
必须使用Application.ProcessMessage
因为如果不使用它 你的循环就会很站时间片 就好象死掉了

 
Sleep运行起来看起来就象死机了一样,何况你还用循环,呵呵
用下面这个函数来实现等待吧,我这个是等待多少秒,你可以改一下。
procedure Wait(const Sec: Word);
var
wStart:LongWord;
begin
wStart:=GetTickCount;
while (GetTickCount-wStart) < (Sec*1000) do
Application.ProcessMessages;
end;
 
我也来玩玩,看看行不行约
 
用ICS控件,wsocket检查status
我就是这么做的,不能用sleep,sleep不处理任何消息
或者用select函数检查socket是否可读
 
那是因为ICS采用的是阻塞模式
 
说的对SLEEP不处理任何消息,以前我也因为SLEEP函数头痛了好一阵子
 
to 教父:
ics的connect是非阻塞模式,你是一下就职到了
 
我倒建议使用阻塞方式,通过线程来调用比较好写,这样你可以控制严格的同步问题,

如果使用非阻塞方式的话,你在连接和发送之间增加一些时间差,并且你在发送前检查
是否已经连接。
 
不知道TClientsocket是否有BUG,我单步调试时,在运行CLOSE前拔掉网线,
程序一样运行过去了,而且ACTIVE确变成了FALSE,服务器端还一直保持着
连接。继续关注此问题。
 
第一clientSocket没有什么大bug,
是因为你不理解socket的工作原理所以
说他有问题
放在连接成功onconnected里面
prnclientsocket.Socket.SendText('asd');
 
prnclientsocket:=TClientsocket.create(self);
prnclientsocket.Port:=1024;
prnclientsocket.Host:='pc';
prnclientsocket.Open;
prnclientsocket.Socket.SendText('asd');
prnclientsocket.close;//若只是发信息,现在已经搞定!


 
如果只是这样:

prnclientsocket:=TClientsocket.create(self);
prnclientsocket.Port:=1024;
prnclientsocket.Host:='pc';
prnclientsocket.Open;
prnclientsocket.Socket.SendText('asd');
prnclientsocket.close;//若只是发信息,现在已经搞定!

好象还是不可以。
 
咳!注意,非阻塞方式是事件驱动!!!!
open后第一次联系服务器要放在onconnected事件中!!!!!
以后就可以在onread,onwrite中!
 
后退
顶部