这几天编一个点对点的传输程序,一个服务端,很多客户端,之间传输大量的图像数据,本来写好后感觉没有问题,可是测试的时候,总是报一些乱七八遭的错误,
最后发现一个小问题,在这里说出来,希望对用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事件中。
什么是非阻塞方式?
一旦服务器与客户端建立了连接之后,就可以通过 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 中将为每一个阻塞方式的连接自动分配一个新的线程,这样即使一个客户正在进行读写操作,其他的客户也不必等待
分享到:
相关推荐
sock学习资料.rar
soft_用ASP操作SOCK的组件.zip.zip
计算机软件-编程源码-超强超完善的pb-SOCK网络源码.zip
1.网络通信原理和协议结构 1.1网络通信原理 1.2网络七层结构介绍 1.3常见tcp/ip协议结构定义 2.SOCK 详解 2.1网络理论/结构 2.2IP 处理 2.3SOCK套接字 2.4SOCK 函数 3.协议通信 ... 4.SOCK应用 ...
用SOCK_RAW编写的ping程序 C++语言 只有简单的ping功能
GO语言开发,系统兼容性非常好,性能强悍,访问视频网站都是不到2%的CPU和不到10M不到的内存消耗。
linux_sock_raw原始套接字编程
windows sock server.for sock server.1~500 client connect server.
web socket 可以用来做聊天系统,该包含有其相关的三个工具js,需要的可以去下载哦!
sock32.dll vc源代码sock32.dll vc源代码sock32.dll vc源代码sock32.dll vc源代码
作为一个程序员,使用这些现有的协议传送文件相当简单,不过,它们只适用于服务器模式中。这样,当我们想在点与点之间传送文件就不适用了或相当麻烦,有一种大刀小用的意味。笔者一直想寻求一种简单有效,且具备多...
端口扫描类代码,可实现断点扫描跟IP地址段扫描
Tun2Socks for Windows
SOCKET API 一个简单的例子。很久以前的。不记得了。
经过一番搜寻,在CSDN上找到了下载地址:http://download.csdn.net/download/fksec/4663589 通过注释掉Makefile里的这句话,可以在cygwin环境里编译通过。 1#LIBS = /usr/ucblib/libucb.a -lsocket -lnsl 由于此...
Java网络编 _TCP程序设计笔记
ACE数据的传输,使用ACE代码编写,实现数据的传输
sockjs.min.js WebSocket开发必备
主要介绍了解决ubuntu vps安装docker时报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.问题的相关资料,文中介绍非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
计算机软件-商业源码-超强超完善的pb-SOCK网络源码.zip