用Delphi写了一段接收的代码,但是翻译成VC的过程中有点问题,就是动态设置缓冲区大小的问题,看代码:procedure SocketWorkThread(ns :TSocket);stdcall;
var
recvbuf :array[0..buflen -1] of Char; //接收数据的缓冲区
recvAllBuff:array of Char; //每接受一次,就把缓冲区中的数据copy到这里
rtn,k ,i,j:Integer;
rs :string;
error :string; _outTime:timeval;
_fdSet:TFDSet;
begin
//设置为非阻塞式
j := 1;
ioctlsocket(ns,FIONBIO,j);
_outTime.tv_sec := 0;
_outTime.tv_usec := 0; //以下为接收代码 i := 1; //计数器
while true do
begin
FD_ZERO(_fdSet);
FD_SET(ns,_fdSet);
if select(ns,@_fdSet,nil,nil,@_outTime) > 0 then //如果有可读的数据
begin
if FD_ISSET(ns,_fdSet) then
begin
rtn := recv(ns,recvbuf,buflen,0);
//如果客户端断开连接
if rtn < 1 then
begin
i := 1;
for k := 0 to clientslist.Count -1 do
begin
if ns = pclients(clientslist.Items[k]).soc then
begin
clientslist.Delete(k);
Break;
end
else Continue;
end;
closesocket(ns);
error := IntToHex(ns,2)+'退出';
server.mmo1.Lines.Add(error);
ExitThread(0);
end; if Length(recvAllBuff) = 0 then //第一次接收时还没有分配内存,所以=0
begin
SetLength(recvAllBuff,buflen); //分配给它一个缓冲区大小的内存
end
else //第一次以后的接收代码
begin
if rtn = buflen then
begin
//如果接收到的数据量大小 = 缓冲区大小,
//则增加recvAllBuff一个缓冲区的大小,以存放数据
SetLength(recvAllBuff,buflen*(i));
end
else
begin
//否则,接收到多少数据,就给recvAllBuff分配多少空间
SetLength(recvAllBuff,buflen*(i-1)+rtn);
end;
end;
//把缓冲区的数据copy到recvAllBuff中
CopyMemory(@recvAllBuff[(i-1)*buflen],@recvbuf,rtn);
Inc(i); //计数器自增
end;
end
else //如果没有可读的socket
begin
if Length(recvAllBuff)>0 then //如果recvAllBuff不为空,说明接收到了数据
begin
//把recvAllBuff中的数据显示出来
rs := PChar(recvAllBuff);
server.mmo1.Lines.Add(rs);
SetLength(recvAllBuff,0); //清空内存
i := 1; //重置计数器
end;
end;
end;
end;关键就是Delphi中的这个SetLength函数,在VC中怎么实现呢?如果不能实现的话,发送的数据一旦超出了缓冲区大小,就不好处理了。就是说VC中怎么给一个数组追加分配内存呢?难道要用链表来实现?
请高手指点一二~
var
recvbuf :array[0..buflen -1] of Char; //接收数据的缓冲区
recvAllBuff:array of Char; //每接受一次,就把缓冲区中的数据copy到这里
rtn,k ,i,j:Integer;
rs :string;
error :string; _outTime:timeval;
_fdSet:TFDSet;
begin
//设置为非阻塞式
j := 1;
ioctlsocket(ns,FIONBIO,j);
_outTime.tv_sec := 0;
_outTime.tv_usec := 0; //以下为接收代码 i := 1; //计数器
while true do
begin
FD_ZERO(_fdSet);
FD_SET(ns,_fdSet);
if select(ns,@_fdSet,nil,nil,@_outTime) > 0 then //如果有可读的数据
begin
if FD_ISSET(ns,_fdSet) then
begin
rtn := recv(ns,recvbuf,buflen,0);
//如果客户端断开连接
if rtn < 1 then
begin
i := 1;
for k := 0 to clientslist.Count -1 do
begin
if ns = pclients(clientslist.Items[k]).soc then
begin
clientslist.Delete(k);
Break;
end
else Continue;
end;
closesocket(ns);
error := IntToHex(ns,2)+'退出';
server.mmo1.Lines.Add(error);
ExitThread(0);
end; if Length(recvAllBuff) = 0 then //第一次接收时还没有分配内存,所以=0
begin
SetLength(recvAllBuff,buflen); //分配给它一个缓冲区大小的内存
end
else //第一次以后的接收代码
begin
if rtn = buflen then
begin
//如果接收到的数据量大小 = 缓冲区大小,
//则增加recvAllBuff一个缓冲区的大小,以存放数据
SetLength(recvAllBuff,buflen*(i));
end
else
begin
//否则,接收到多少数据,就给recvAllBuff分配多少空间
SetLength(recvAllBuff,buflen*(i-1)+rtn);
end;
end;
//把缓冲区的数据copy到recvAllBuff中
CopyMemory(@recvAllBuff[(i-1)*buflen],@recvbuf,rtn);
Inc(i); //计数器自增
end;
end
else //如果没有可读的socket
begin
if Length(recvAllBuff)>0 then //如果recvAllBuff不为空,说明接收到了数据
begin
//把recvAllBuff中的数据显示出来
rs := PChar(recvAllBuff);
server.mmo1.Lines.Add(rs);
SetLength(recvAllBuff,0); //清空内存
i := 1; //重置计数器
end;
end;
end;
end;关键就是Delphi中的这个SetLength函数,在VC中怎么实现呢?如果不能实现的话,发送的数据一旦超出了缓冲区大小,就不好处理了。就是说VC中怎么给一个数组追加分配内存呢?难道要用链表来实现?
请高手指点一二~
解决方案 »
- FileStream分割问题
- dbgrideh 字段累加和时 出错
- 求助
- 如何用delphi做类似vba的开发
- 如何捕获窗体级或程序级的键盘事件?
- 感谢letgolxh(夕阳倦鸟)兄的xml2access,access2xml示例
- 在DELPHI下,SOCKET编程,READ,WRITE的问题 (谢谢大家,进来看看也好)
- 关于listview 中怎样才能不让这样的错误发生
- 怎样在Delphi中实现网络地址影射
- 真的很想做好每一件事情,所以总在不停的努力,可结果总不是很理想,我不停的努力,也不停的承受打击,我坚信前途是光明的,但道路也真的
- oralce字段blob类型,怎样处理word文档?显示、保存
- Delphi7中ADOQuery结果集
CString str="abcedf";
int iLength=0;iLength=str.GetLength();//取得字符串长度
char * recvAllBuff;recvAllBuff = new char[buflen*(i)];大概是这样吧
先定义
char * recvAllBuff;
然后用
recvAllBuff=(char *)malloc(1); //这里可用非0的任意正整数
然后对所的
SetLength(recvAllBuff,xxx);
用
recvAllBuff=(char *)realloc(recvAllBuff,xxx);
替换就应该可以了