[急,高分求教]服务器用WinSocket的Send函数,为什么客户端有时会收不到?

onehawk 2005-03-24 08:16:34
如标题
我在写一个通信软件时,服务器用Send发送信息,但是明明Send返回值>0,但是客户端却有时会收不到信息
我是用TServerSocket和TClientSocket做的,至于为什么不用Indy是另有原因.
在服务器和Client每收到一个消息时我就新建 一个线程去处理.
请教一下这会是什么原因?
还有Select怎么用?
急啊!!!!
...全文
93 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jilu_sun 2005-04-26
  • 打赏
  • 举报
回复
MARK
flyinwuhan 2005-03-24
  • 打赏
  • 举报
回复
>>当我同时5个用户登录时,会出现有的用户只收到了2~3个的情况(本来应该是4个)
感觉是你的程序的算法或逻辑问题。。。。不应该是socket的问题。。。。。再检查一下你的代码。。。
onehawk 2005-03-24
  • 打赏
  • 举报
回复
谢谢楼上提供的select
是这样的,用户登录服务器时,服务器返回当前在线用户情况,服务也将该新用户的信息传达给其它在线用户.
问题就是
当我同时5个用户登录时,会出现有的用户只收到了2~3个的情况(本来应该是4个)
而在我手动调用过Select之后,情况有点好转,但是问题依然存在.
就是搞不错倒底是什么原因.
flyinwuhan 2005-03-24
  • 打赏
  • 举报
回复
Select怎么用?
TServerSocket和TClientSocket已经不停地select了,你还select干什么~~~~~~```

select():检查一或多个 Sockets 是否处於可读、可写或错误的状态。

格 式: int select( int nfds,
fd_set FAR *readfds,
fd_set FAR *writefds,
fd_set FAR *exceptfds,
const struct timeval FAR *timeout );

参 数: nfds 此参数在此并无作用
readfds 要被检查是否可读的 Sockets
writefds 要被检查是否可写的 Sockets
exceptfds 要被检查是否有错误的 Sockets (*暂无作用)
timeout 此函式该等待的时间。若为 NULL 时,
表示 blocking,此函式会等到有事件发生。

传回值: 成功 - 符合条件的 Sockets 总数 (若 Timeout 发生,则为 0)
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)

说明: 使用者可利用此函式来检查 Sockets 是否有资料可被读取,
或是有空间可以写入,或是有错误发生。

fd_read : TFDSet;
timeout : TTimeVal;

FD_ZERO( fd_read );
FD_SET( FSock, fd_read );

timeout.tv_sec := 0;
timeout.tv_usec := 500;

if select( 0, @fd_read, nil, nil, @timeout ) > 0 then //至少有1个connection可读
begin
if FD_ISSET( FSock, fd_read ) then
begin
for i:=0 to fd_read.fd_count-1 do //注意,fd_count <= FD_SETSIZE(64)
begin
。。。。。。。

1,593

社区成员

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

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