偶这几天编一个点对点的传输程序,一个服务端,很多客户端,之间传输大量的图像数据,本来写好后感觉没有问题,可是测试的时候,总是报一些乱七八遭的错误,
最后发现一个小问题,在这里说出来,希望对用sock传输的哥们有点帮助:
Socket.SendBuf(SendBuf^, li_ESendSize),sendbuf是我定义的指针,在发出这个
命令后,不能立即FreeMem(sendbuf)释放sendbuf,因为这时有可能还没有将所有内容发出去,所以如果要将内存块发送出去,最好是将buf定义为公共变量,分配好内存,在sock的read事件中对用buf读要发送的内容,在sendbuf发送,等到程序退出时再去释放buf
我以前的程序
           ...
            GetMem(SendBuf, li_ESendSize);
            PRFS_SendFile.ReadBuffer(SendBuf^, li_ESendSize);
            Socket.SendBuf(SendBuf^, li_ESendSize);
            FreeMem(ls_SendBuf);
         ...
改后为            PRFS_SendFile.ReadBuffer(SendBuf^, li_ESendSize);
            Socket.SendBuf(SendBuf^, li_ESendSize);
将getmem放在了窗体打开的事件中
FreeMem(ls_SendBuf)放在close事件中。

解决方案 »

  1.   

    呵呵。。楼主观察得很仔细
    楼主是用的非阻塞方式的SOCKET吗?
      

  2.   

    一直都在用非阻塞方式的SOCKET,方便控制
      

  3.   

    to:xxxxxxxxx(xxxxxxxxx)
      一旦服务器与客户端建立了连接之后,就可以通过 Internet 传输数据和文件。但是在WinSock中存在两种传输模式“阻塞”和“非阻塞”的概念。  一般都采用非阻塞方式。在客户端,如果把 ClientType特性设置为ctNonBlocking,表示采用非阻塞方式进行连接。当服务器端 Socket试图进行读/写操作的时候,客户端 Socket就会得到通知,即OnRead或者OnWrite事件。  对于服务器端Socket来说,如果把ServerType特性设置为 StNonBlocking,表示采取非阻塞方式进行连接。当客户端 Socket试图进行读/写的时候,服务器端Socket就会得到通知,即OnClientRead或者OnClientWrite事件。  与非阻塞方式不同的是,在阻塞方式下没有诸如OnRead或者OnWrite等异步事件。Socket必须主动去读或者写数据。在读写操作完成之前,其他代码都无法执行,成为了纯粹的独占使用方式,整个应用程序将处于等待状态,大大降低应用程序的性能。  对于客户端Socket来说,如果把 ClientType特性设置为ctBlocking,表示采取阻塞方式进行连接,为了尽可能的减少阻塞方式的负面影响,可以把所有涉及到读写的操作放在一个单独的线程中,这样可以使其他的线程可以继续得到执行。  对于服务器端 Socket来说,如果把ServerType设置为stThreadBlocking,表示采取阻塞方式进行连接。Delphi 中将为每一个阻塞方式的连接自动分配一个新的线程,这样即使一个客户正在进行读写操作,其他的客户也不必等待。
      

  4.   

    楼主的程序可以很好连通internet上的机子吗?
    我写过总是不行有时会单方连通一方不通,有时还都不通,也有都通的时候,在两条ADSL上试的,
    后来就不做了.楼主如果可以的话能不能把你的程序给我学习一下
    [email protected]
    万分感谢!
      

  5.   

    我也想知道你是怎么解决的!我的[email protected]!谢谢!
      

  6.   

    也可是试试这个办法:
    try
      getmem(sendbuf,1024)
      ******
    finnaly
      free(sendbuf)
    end;
    这样应该不会出问题,楼主说的那种办法有隐患存在,如果异步传输,当第一包没有传出去,第二包又发送这样会丢失数据,@!
      

  7.   

    对不起,弟兄们,我的程序还是有问题,我已帖出部分代码http://community.csdn.net/Expert/topic/3164/3164029.xml?temp=.6642267
    欢迎探讨!