以太网模块作服务器时,同时只能接受一个客户端,TCP短连接的问题 ( 积分: 300 )

  • 主题发起人 主题发起人 eachbuilder
  • 开始时间 开始时间
E

eachbuilder

Unregistered / Unconfirmed
GUEST, unregistred user!
以太网模块作服务器时,同时只能接受一个客户端。现有两个客户端需要通讯,所以只能采取轮流的方式。在PC机上写了一个客户端程序,需要采用短连接,就是说“连接”-〉“发送命令”-〉“接收数据”-〉“断开”,然后等待一段时间,大概15秒钟(让另一个客户端通讯),接着一直重复这个过程。可是一段时间后,发现PC机上有好多TCP连接(netstat)连到同一个服务器端,是没有断干净。
实际上,PC程序要多线程的连30左右的服务器,这样下来,本机的端口不是很快就耗尽?
还有,这个TCP通讯用阻塞还是非阻塞方式?我用非阻塞方式时,发现还没有接收完数据,连接就断开了。
 
以太网模块作服务器时,同时只能接受一个客户端。现有两个客户端需要通讯,所以只能采取轮流的方式。在PC机上写了一个客户端程序,需要采用短连接,就是说“连接”-〉“发送命令”-〉“接收数据”-〉“断开”,然后等待一段时间,大概15秒钟(让另一个客户端通讯),接着一直重复这个过程。可是一段时间后,发现PC机上有好多TCP连接(netstat)连到同一个服务器端,是没有断干净。
实际上,PC程序要多线程的连30左右的服务器,这样下来,本机的端口不是很快就耗尽?
还有,这个TCP通讯用阻塞还是非阻塞方式?我用非阻塞方式时,发现还没有接收完数据,连接就断开了。
 
procedure TClientThread.Execute;
var
strCommand: string;
strRevData: string;
begin
FEvent:= CreateEvent(nil, False, False, nil);

try
while (not Terminated) do
begin
if Terminated then Break;

try
try
FTcpClient.Connect;
except
FTcpClient.Disconnect;
end;

try
if FTcpClient.Connected then
begin
if Terminated then Break;

FTcpClient.Sendln(strCommand);

strRevData:= FTcpClient.Receiveln;
end;
except
FTcpClient.Disconnect;
end;
finally
FTcpClient.Disconnect;
end;

if Terminated then Break;

WaitForSingleObject(FEvent, 15000);
end;
except
raise;
end;

if Terminated then
begin
FTcpClient.Free;
end;

CloseHandle(FEvent);
end;
 
以太网服务器的软件是周立功提供的还是你自己写的,如果是周立功提供的那只能找周立功提供解决方案,如果是你自己写的或者你可以自己修改,那么最好是将服务器做成多任务的系统,修改软件的架构,这样才能够响应多个连接,至于连接的最大数量你可以自己指定,好像周立功本身也有比较简单的嵌入式多任务实时操作系统,网上也有一些开源的,比如UCOSII,还是比较稳定的,已有多种CPU的移值案例。
 
太网服务器的软件是周立功提供的,这个是嵌入式设备,我咨询过了,目前没有解决方案,只能同时提供一个客户端。我要求也不高,不要多个,只要两个。不知道其它牌子的模块有没有这个功能。
 
可以试试一个客户端连接服务器,同时这个客户端向另一个客户端转发数据
 
方案是定下来了,主要是我的程序代码的问题,请大家帮忙看看
 
我也遇到了这问题
 
后退
顶部