如标题
我在写一个通信软件时,服务器用Send发送信息,但是明明Send返回值>0,但是客户端却有时会收不到信息
我是用TServerSocket和TClientSocket做的,至于为什么不用Indy是另有原因.
在服务器和Client每收到一个消息时我就新建 一个线程去处理.
请教一下这会是什么原因?
还有Select怎么用?
急啊!!!!

解决方案 »

  1.   

    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
          。
      

  2.   

    谢谢楼上提供的select
    是这样的,用户登录服务器时,服务器返回当前在线用户情况,服务也将该新用户的信息传达给其它在线用户.
    问题就是
    当我同时5个用户登录时,会出现有的用户只收到了2~3个的情况(本来应该是4个)
    而在我手动调用过Select之后,情况有点好转,但是问题依然存在.
    就是搞不错倒底是什么原因.
      

  3.   

    >>当我同时5个用户登录时,会出现有的用户只收到了2~3个的情况(本来应该是4个)
    感觉是你的程序的算法或逻辑问题。不应该是socket的问题。。再检查一下你的代码