一个关于SOCKET通讯的数据传送及接收的问题。 ( 积分: 200 )

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

tanxj

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端有一个字串发给服务器,并等待服务器返回数据。
例如:
procedure SendDataTest;
begin
如果 clientSocket.socket.sendText('OK?'); 成功
这里要等待服务器应答,直到有数据返回。不要让它产生一个ONSocketRead事件。
if ClientSocket.ReceiveText = 'OK' then
//做一些事。
end;
怎样控制它等待多长时间就认为服务器没有数据返回,然后让此过程提示出错。
而且如果服务器返回的数据包大于一个数据包的大小时,这样返回的字串会不会少掉一部分?
 
客户端有一个字串发给服务器,并等待服务器返回数据。
例如:
procedure SendDataTest;
begin
如果 clientSocket.socket.sendText('OK?'); 成功
这里要等待服务器应答,直到有数据返回。不要让它产生一个ONSocketRead事件。
if ClientSocket.ReceiveText = 'OK' then
//做一些事。
end;
怎样控制它等待多长时间就认为服务器没有数据返回,然后让此过程提示出错。
而且如果服务器返回的数据包大于一个数据包的大小时,这样返回的字串会不会少掉一部分?
 
你要设置为阻塞方式。
 
有超时设置吧。
 
怎样用SOCKET同时传送文件和字符串?
 
用异步Socket,多线程,最好自己用WinSock API做,控件似乎总有些问题。通讯程序做得好不容易。
 
uses winsock;

procedure SendDataTest;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
如果 clientSocket.socket.sendText('OK?'); 成功
//这里要等待服务器应答,直到有数据返回。不要让它产生一个ONSocketRead事件。
FD_ZERO(FDSet);
FD_SET(ClientSocket.socket.SocketHandle, FDSet);
TimeVal.tv_sec := 10; //设置超时(秒)
TimeVal.tv_usec := 500;//设置超时(毫秒)
if (select(0, @FDSet, nil, nil, @TimeVal) > 0) then
begin
if ClientSocket.socket.ReceiveText = 'OK' then
//做一些事。
end else
showmessage('超时或出错'+inttostr(getlasterror));
end;
 
有技术含量!
 
不要让它产生一个ONSocketRead事件?
这种作法不对,服务器(包括其他地方发来的)返回任何东东都会触发此事件;

超时检测只能检测到在规定时间内没有收到任何东西才超时;
一有ONSocketRead就终止TIMER1.enabled:=false;
至于跳转或分支,是你根据收到的是'OK'?还是其他来作;
 
迷糊的方法简单,方便。
只是在等待过程中CPU占用为100,而且程序无法退出。
最好是可以在主程序中做个断点,直到某个事件确发。
 
多人接受答案了。
 
后退
顶部