在使用非阻塞的ServerSocket与阻塞的ClientSocket通讯时,为什么可以收到信息,而发出的信息ClientSocket收不到??(急)(100分

  • 主题发起人 主题发起人 rich_liu
  • 开始时间 开始时间
R

rich_liu

Unregistered / Unconfirmed
GUEST, unregistred user!
在使用非阻塞的ServerSocket与阻塞的ClientSocket通讯时,为什么可以收到信息,而发出的信息ClientSocket收不到??(急)(100分)<br />服务端响应如下:
procedure TfrmSp_Fzserver.ServerFzSpClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
RecvSize1,RecvSize2,DeSize:integer;
commandI,MessageSize:LongWord;
buf:array of byte;
stream1:TWinSocketStream;
begin
RecvSize1:=0;
RecvSize2:=0;
FillChar(cHeadercon,SizeOf(cHeadercon),0);
RecvSize1:=socket.ReceiveBuf(cHeadercon,SizeOf(cHeadercon));
commandI:=ntohl(cHeadercon.CmdId);
MessageSize:=ntohl(cHeadercon.msgLen);
if commandI=$23 then
begin
memo1.Lines.Add('********************接收到Request请求********************');
DeSize:=SizeOf(cRequest);
FillChar(cRequest,SizeOf(cRequest),0);
FillChar(cRequest_Resp,SizeOf(cRequest_Resp),0);
RecvSize2:=Socket.ReceiveBuf(cRequest,MessageSize-RecvSize1);
if (RecvSize2+RecvSize1)&lt;&gt;MessageSize then
begin
memo1.Lines.Add('**********************Request数据接收错误*******************');
exit;
end;
fillchar(sHeadercon,sizeOf(sHeadercon),0);
RecvSize2:=0;RecvSize1:=0;
sHeaderCon.CmdId:=htonl($80000023);
sHeaderCon.SeqNum1:=cHeaderCon.SeqNum1;
sHeaderCon.SeqNum2:=cHeaderCon.SeqNum2;
sHeaderCon.SeqNum3:=cHeaderCon.SeqNum3;
sHeaderCon.MsgLen:=htonl(sizeof(sHeadercon)+sizeof(cRequest_Resp));
cRequest_Resp.result:=0;
setlength(buf,29);
copymemory(@buf[0],@cHeadercon,SizeOf(cHeadercon));
copymemory(@buf[SizeOf(cHeadercon)],@cRequest_resp,SizeOf(cRequest_Resp));
RecvSize1:=Socket.SendBuf(buf[0],SizeOf(cHeadercon)+SizeOf(cRequest_Resp)); //SendBuf(buf[0],SizeOf(cHeadercon)+SizeOf(cRequest_Resp));
if (RecvSize1+RecvSize2)&lt;&gt;ntohl(cHeadercon.MsgLen) then
begin
memo1.Lines.Add('**********************响应Request请求错误***********************');
exit;
end;
end
end;
 
有没有错误信息,把它POST出来
阻塞模式发送数据前,要检查对方是否已经准备好,
是否因为对方无相应而没有发送
 
你的客户代码是?
 
客户程序是别的厂家的无法获知!
只是在程序中确实接受到了客户端的信息,但是服务端发送信息后客户端总是尝试重连,因此我怀疑没有发送成功.
to rockythd:如何要检查对方是否已经准备好??
是否要在客户端连接上后做什么操作??
 
不要用Socket.SendBuf来发送,它在发送数据失败时会判断对方是否阻塞式Socket,如果是
的话TServerSocket就会主动关闭Socket,这样就导致了以上结果。你尝试一下用API:recv
接收,send发送。例:
send(Socket.SocketHandle, Buf, Count, 0);
这样不会导致服务器端主动关闭Socket,但深层的影响我还没有深入调试过。你试用看看。
另一个解决的办法是你的服务器端采用线程阻塞方式,可能在维护线程时有点麻烦。
 
给个新思路,不会是客户端受到了信息,但认为格式有问题,所以重新连接?数据肯定发出去了
 
你的客户程序是别的厂家的;那么你和客户程序的通讯协议是否统一了?如果
协议不统一,即使客户程序受到了你发给它的数据,由于通讯协议不统一,它会
认为受到的是错误的数据而抛弃掉,而你又怎么来判断客户程序没有受到数据呢
 
我想这和组塞和非组塞没多大关系,只是和自定义协议有关系[8D]
 
后退
顶部