主页
Top.Mail.Ru Yandeks.Metrika
论坛:“网络”;
当前存档:2002.04.01;
下载:[xml.tar.bz2];

向下

使用套接字 找到类似的分支


Valdemar   (2002-01-17 14:37) [0]

我在同步模式下使用套接字。 如何确定输入流中是否有未读数据。 如果可以尝试。
在此先感谢。



Digitman   (2002-01-17 14:41) [1]

在同步模式下,无需确定任何内容。 在此模式下,OnRead事件恰好在输入流中存在可读数据时发生



Valdemar   (2002-01-17 16:16) [2]

那为什么这段代码不起作用?

procedure TForm1.ServerSocket1ClientRead(Sender:TObject;
套接字:TCustomWinSocket);
VAR
tr:trec;
开始
Application.ProcessMessages;
插座。 ReceiveBuf(tr,sizeof(tr));
//处理

结束;



Digitman   (2002-01-17 17:25) [3]

1。 为什么-Application.ProcessMessages?
2。 这是什么意思-“不起作用”?



Valdemar   (2002-01-17 18:03) [4]

Application.ProcessMessages,以便应用程序在等待数据时不会冻结
而且它不起作用,因为它没有到达这里



Digitman   (2002-01-17 18:15) [5]

为什么应用程序应该“冻结”某些内容? 它在您的OnClientRead处理程序中是否运行很长时间? 从片段中可以明显看出,在读取缓冲区之前,您没有任何循环。

“丢失”表示“客户端”没有传输任何东西,或者服务器处于不活动状态,或者是ThreadBlocking,或者...还有很多原因!

您确定“客户端”已成功连接到服务器吗? 基于什么确定? 是否发生OmClientCoinnect事件? 如果-发生,则OnClientRead事件也应发生。 如果不存在,则意味着连接已经断开,或者“客户端”没有发送任何内容或发送不正确的消息,或者……再次-您永远都不知道!



Valdemar   (2002-01-17 19:03) [6]

那就是onThreadBlocking服务器



Valdemar   (2002-01-17 22:20) [7]

我确定客户端连接正确,因为发生onAccept时,我可以正常读取数据,但无法读取数据的下一部分。



Digitman   (2002-01-18 08:54) [8]

你说线程阻塞?
然后,我可以确定地假设您没有考虑重写TServerClientThread类。 而且,我什至没有查看其ClientExecute方法的实现。 对不对 然后看这里,我将为您分析ThreadBlocking服务器上客户端连接的传输流中发生的事情:

过程TServerClientThread.ClientExecute; 变种 FDSet:TFDSet; TimeVal:TTimeVal; 开始 //虽然没有关于流完成的信号,并且传输处于活动状态 而没有终止和ClientSocket.Connected做 开始 FD_ZERO(FDSet); FD_SET(ClientSocket.SocketHandle,FDSet); TimeVal.tv_sec:= 0; TimeVal.tv_usec:= 500; //等待半秒钟,检查与套接字关联的WSAEvent事件对象的状态 如果(选择(0,@FDSet,nil,nil,@TimeVal)> 0)并且未终止 //如果WSAEvent事件对象处于Signaled状态(更确切地说,它通知FD_READ事件),并且尚未从外部通知流是否需要完成,则: 如果ClientSocket.ReceiveBuf(FDSet,-1)= 0,则 //如果套接字读取缓冲区为空 断开//退出循环,结束传输,客户端连接将被断开-客户端不再有数据 别的 同步(DoRead); //在主流中引发OnClientRead事件,可以在其中读取缓冲区(全部或部分) 如果(选择(0,nil,@FDSet,nil,@TimeVal)> 0)并且未终止则 同步(DoWrite); //引发一次OnClientWrite事件,以通知套接字已准备好将数据发送到客户端 结束 结束



Digitman   (2002-01-18 09:00) [9]

因此,在OnAccept()事件中,您获取了套接字读取缓冲区,缓冲区为空(客户端不再传输任何内容),并且传输进入Disconnected状态(客户端只是与服务器断开连接),并且传输流终止或由调度程序返回到空闲池(与KeepInCache = True)



Страницы: 1 整个分支

论坛:“网络”;
当前存档:2002.04.01;
下载:[xml.tar.bz2];

楼上









内存:0.59 MB
时间:0.026 c
14-284年
弗拉基米尔·卢本琴科
2002-02-15 22:08
2002.04.01
适用于Delphi 6.03的Report Builder Enterprise 6


3-77年
Dimedrol
2002-02-13 10:32
2002.04.01
我从Interbase开始。


1-88年
DimaIv
2002-03-20 09:04
2002.04.01
在其中有一个带有铭文的组合框是ProgressBar


1-238年
AlexMey
2002-03-19 12:59
2002.04.01
创建自己的类?


1-107年
kolobok
2002-03-21 12:33
2002.04.01
内置复选框TStringGrid的问题!





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский