首次用Socket编程,菜鸟问题!大虾们快帮忙呀!(50分)

  • 主题发起人 主题发起人 tresa
  • 开始时间 开始时间
T

tresa

Unregistered / Unconfirmed
GUEST, unregistred user!
我分别在服务器端和客户端用了TServerSocket和TClientSocket控件,然后想传送一个浮点数组[0,1.33,2.67,4.0,5.33],用的是SendBuff和ReceiveBuff命令,但是客户端总是没有接收到数据,请大虾们看看,到底是哪里的问题,在线等待!!!代码如下:
1)在服务器端ServerSocket1ClientRead事件里,
var
i,m:Integer;ft_buffer:Array[0..4] of Real;
begin
for i:=0 to 4 do
ft_buffer:=i*4/3.0;
m:=Socket.SendBuf(ft_buffer,sizeof(ft_buffer));
Showmessage(IntToStr(m));
end;
2) 在客户端的ClientSocket1Read事件里,
var
j:Integer;
begin
j:=Socket.ReceiveBuf(rl_buffer,sizeof(rl_buffer));
Showmessage(IntToStr(j));
end;
对了,补充一句,客户端的rl_buffer我定义成了全局变量。
运行后,服务器端的m总是为40,而客户端的j总是为-1,不知道是什么问题???
 
你的套接字是否已经建立?
 
Delphi7中怎么没有TClientSocket/TServerSocket控件了?
 
to Lotus123:
d7中默认的没有装,用的话自己安装那个包就可以了
 
To xianguo,那应该如何建立套接字呢?新手上路,不好意思,请多指教!
 
你的m和j我看不出意义,如果你取发送或者接收的程度,发送的长度自己很清楚,接收的长度可以用:socket.receivelength。socket.receivbuf后,receivelegnth的长度会变为0,所以j等于-1。
 
其实这个程序我换用Socket.sendtext和Socket.receiveText,就运行成功,而用Socket.sendbuff和Socket.receivebuff就不行,的确很奇怪,难道中间还有什么需要预先定义或是声明的吗?
 
先要保证连接是成功的,在察看主程序有没有问题,我觉得你的m是整形,却被赋值
sendbuf(),这个好像不对,最后检查你的m是否发送过去,在检查是否接受到,可以用单步调试,看是否运行顺序正确1
 
用SendText比较方便(其实SendText也是调用SendBuf)
 
问题是我想传送的是浮点数组,如果先用SendText传送,那还要进行类型转换,就效率很低了呀
 
试验一下这样做:
收:
var
m:integer;
Buffer:pchar;
begin
GetMem(Buffer,2047);
m:= Socket.ReceiveBuf(Buffer^,bufferSize);//m为收到的字节数,从buffer里取你的数
FreeMem(Buf);
end;
发:
var
j:Integer;
begin
GetMem(Buf,(你发送的字节数));
Socket.SendBuf(Buf^,(你发送的字节数));
FreeMem(Buf);
end;
 
数组类型应该是一个基类型:Byte或Char,接收后再转化成浮点型
或者用Sendtext应该也可以
 
下面的程序是没有问题的
procedure TForm1.Button1Click(Sender: TObject);
var
Buf : array [0..9] of real;
i : integer;
begin
for i:=0 to 9 do
begin
Buf := 0.05 + i;
Memo1.Lines.Add(FloatToStr(Buf));
end;
i := Length(Buf);
if ServerSocket1.Active then
ServerSocket1.Socket.Connections[0].SendBuf(Buf,i*SizeOf(real));
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Buffer : array [0..19] of real;
i,m : integer;
begin
for i:=0 to 19 do
Buffer := 0;
m := Socket.ReceiveLength;
Socket.ReceiveBuf(Buffer,m);
m := m div SizeOf(real);
for i:=0 to m-1 do
Memo2.Lines.Add(FormatFloat('0.00',Buffer))
end;

 
我用GetLastError获得的ErrorId是10035,用VC里的ErrorLookup查看,提示是“无法立即完成一个非阻挡性套接字操作”.但是在用SendText和ReceiveText时,却没有这个错误(那就说明套接字是建立成功了的呀),真是一头雾水!
 
后退
顶部