TCP短连接-Client端如何才能open后立刻发送某包给Server端,再有效Close该TCP连接?

Changlu 2005-02-24 03:14:32
请问一下大家:)
背景是:TCP通信,互为Server/Client,短连接-使用TServerSocket和TClientSocket。每个我们的通信包,Client端先open从而Connect上Server端,然后发送包给Server端,再Close该TCP连接。

现象是Client端,在open后(已成功建立TCP连接),立刻用SendText函数发送我们的通信包给Server端,则Server端不能收到该包。在open以后,如果不在同一函数内立刻发送,而是用BUTTON触发来发送该包(也是SendText函数),则Server端可以接收到该包。

请问问题出在哪里?Client端如何才能open后立刻发送某包给Server端,再有效Close该TCP连接???

谢谢啦,请大家帮下忙
...全文
367 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiso 2005-03-12
  • 打赏
  • 举报
回复
顶一下@@
Changlu 2005-03-11
  • 打赏
  • 举报
回复
结贴前想再请问一下大家,INDY组件做TCP短连接的优缺点:)
Changlu 2005-03-11
  • 打赏
  • 举报
回复
那在DELPHI里做SERVER端(有很多客户端时)怎么做比较好呢?
DELPHI2005在这方面有提供啥新东东吗?
cjf1009 2005-03-11
  • 打赏
  • 举报
回复
多线程,速度快,编程简单。但客户端太多了就不好了,因为就会创建太多线程了。
Changlu 2005-02-27
  • 打赏
  • 举报
回复
Server端或Client端先CLOSE TCP连接的优缺点, halfdream(哈欠)或其他人可以评论一下吗?:)

长期运行时,WINDOWS2000PRO对这些TIME_WAIT的TCP连接的自动释放有问题吗?新的TCP连接的建立,或者说要使用WIN系统的TCP资源有问题吗???


我这用短连接(互为C/S)收到数据后,需要计算和不少的数据库处理(SQL SERVER2000)。不知是否有问题?

THANKS for halfdream and all u others!
caiso 2005-02-26
  • 打赏
  • 举报
回复
顶一下,关注
halfdream 2005-02-25
  • 打赏
  • 举报
回复
TIME_WAIT是TCP正常状态之一。。
TCP连接客户端先CLOSE TCP连接。。就会进入这种状态。

Changlu 2005-02-25
  • 打赏
  • 举报
回复
sleep不行。
谢谢大家的回复喽,没马上结贴发分是看看还有点啥问题请教不。

到目前为止选择的是单线程非阻塞方式,按照halfdream(哈欠)的方法,自己用小程序测试时可以,就是不知道和别人的系统联调时是否能支持的住。到时估计每1到3秒会进行一次短连接。有啥意见,还请大家指教。
WINDOWS2000的TCP资源管理和释放好象还可以,只是netstat命令可以看到很多TIME_WAIT的TCP连接还没完全释放,不知道长期运行有否问题。
目前SendText函数发完一个包后Client端主动断开TCP连接,还算正常,但也有些担心长期运行和资源释放的问题。
请大家踊跃指点:)
halfdream 2005-02-24
  • 打赏
  • 举报
回复
》》On a blocking socket...
这儿它说的是阻塞方式的SOCKET啊。。。


TClientSocket缺省是用的非阻塞方式(nonblocking socket)..
你可以设置属性为阻塞方式使用。。

非阻塞与阻塞在使用上各有优缺点,
如果是非阻塞,往往会采用事件或者消息机制。

如果用阻塞方式,发送,接收和连接这些操作都会
阻塞等待,如果在主线程中使用,就会阻塞主线程的消息处理,
所以通常配合多线程。。
gemouzhi 2005-02-24
  • 打赏
  • 举报
回复
用这句调用APICheckSocketResult(WinSock.connect(FSocket, FAddr, SizeOf(FAddr)), 'connect');

其实还是MSDN迷惑了我
On a blocking socket, the return value indicates success or failure of the connection attempt.
connection attempt是什么东西?字面意思是连接尝试啊,所以我有上边的结论“只触发连接但不等待到成功连接才返回”

请问 halfdream(哈欠) 大哥connection attempt是不是保证完成连接?
谢谢
gemouzhi 2005-02-24
  • 打赏
  • 举报
回复
sorry sorry ,是TClientWinSocket的OPEN,我理解上有问题,楼主听 halfdream(哈欠) 大哥的就OK了,我发现我是比较苯的那种。。。。。。
gemouzhi 2005-02-24
  • 打赏
  • 举报
回复
拜托,全是TAbstractSocket的OPEN方法,哪有客户不客户的?听不懂您的意思?
halfdream 2005-02-24
  • 打赏
  • 举报
回复
拜托,gemouzhi老兄。。这说的是客户端。。
gemouzhi 2005-02-24
  • 打赏
  • 举报
回复
>>如果在阻塞方式下,OPEN函数是等待到成功连接才返回,你当然可以OPEN了马上SEND。。

不是很同意,OPEN只是把SOCKET初始化成listen模式,并不管完成连接的事情,只触发连接但不等待到成功连接才返回。
cjf1009 2005-02-24
  • 打赏
  • 举报
回复
sleep(1000)一下呢?
halfdream 2005-02-24
  • 打赏
  • 举报
回复
成功的调用了OPEN函数或CONNECT,并不等于SOCKET连接建立。。
在非阻塞方式下,成功调用OPEN,仅意味着成功的‘开始’去做‘连接’这个动作。。

1,如果在阻塞方式下,OPEN函数是等待到成功连接才返回,你当然可以OPEN了马上SEND。。
2,如果在非阻塞方式,OPEN后,你可以稍等后检查连接状态,如果连接成功才SEND。。

比如
ClientSocket.Active:=true;
while not ClientSocket.Active do
begin
application.processMessages;//这种等待方式最好只工作在主线程。。
end
ClientSocket.Socket.Send....

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧