socket问题,高手请进(80分)

  • 主题发起人 主题发起人 labafa
  • 开始时间 开始时间
L

labafa

Unregistered / Unconfirmed
GUEST, unregistred user!
我用socket,当connected之后不能立即发送消息,
也就是说不能做到在同一procedure中先connect,然后立即发送消息。
 
各位大侠,这样做是不是不可以呢?给点提示好吗?
 
不会把,把服务器端和客户端的ServiceType都设成stNonBlocking看看?(实际上默认的
就是stNonBlocking了),把情况再描述清楚一点,你都用了哪些事件?
 
我認為不必要寫在一起
你在Form的OnCreate中讓其連接
然後在ClientSocket的OnConnect中
發送消息不行嗎?
我已測試通過呢
 
比如说:在一个无需时时连接的程序里,想在需要发消息的时候连接一下,然后就断开。
 
在连接之后发送要检查一下状态,我如下描述:(不是代码)

socket.connect(ip);
start_time:=get_cur_time();
while get_cur_time()-start_time<time_out_value and socket.stat<>connected do
application.processmessage;
if socket.stat=connected
then socket.send(msg)
else error('connect error');
 
谢谢光子,
一般time_out_value设定为多大的数值比较好?
 
居然你把我的“天书”給看看懂了呀,好样的!(看你这么聪明我多说几句)

  time_out_value的具体值要根据具体情况设定,主要是看你在LAN使用呢还是在
Internet上使用,看你是使用的域名格式地址呢,还是IP格式的地址。也还
要看你的策略,如果是让尽可能都连上,那么就设置大点,如果是保证连接速度,也可
以设置小点。一般情况下,如果不解析域名,成功连接正常情况下能在1秒以内完成,
最多也是几秒,如果解析域名会稍微慢些。
 
使用阻塞方式不就可以了么?你的要求正好满足啊.

 
什么叫阻塞方式?请问怎样用?
 
Blocking(阻塞)
在windows环境中,多任务是以循环方式来处理的(称为Event Dispatch Loop),循
环中会一直处理执行GetMessage及DispatchMessage函数,GetMessage用以从系统队列(System Queuing)中取得下一个消息窗口,而DispatchMessage则是将消息宙口交由Windows Procedure(WinProc)来处理。
但若当GetMessage无法正常执行以至于Windows Procedure一直被Queue侧住时,则
会生成所谓的“阻塞”。
为了避免winsockd的socket被程序一直阻塞住,而无法处理(例如结束Socket),
可利用WSAIsBlocking函数,检查Socket是否正在被阻塞住,若返回true值,表示Socket
正被阻塞住,此时便可利用WSACancelBlockingCall函数,删除被阻塞的socket。
 
非阻塞模式下当然不能做到在同一procedure中先connect,然后立即发送消息,先connect,然后在onconnect事件中发送,这个事件说明网络已经连接。
工作原理:
一、非阻塞模式
1、connect <--socket连接服务器
2、send <--立刻执行这条语句,但实际上socket还没建立连接呢,应当在onconnect事件中send
3、onerror事件 <--如果connect错误,则激发这个事件
二、阻塞模式
try
connect(500) <--在500毫秒内必须连接;程序在这里阻塞了
send <--500毫秒内成功建立连接,则运行这条语句
except
...<--500毫秒内没建立连接,则失败
 
后退
顶部