Есть еще сетевая библиотека Lnet.
https://lnet.wordpress.com/
К тому же есть PascalScada, которую можно разширить под ваши требования. MODBUS TCP/RTU уже реализованы. Подключение к базам данных тоже через Zeos. Нехватает только MODBUS TCP сервера.
Модератор: Модераторы
//существуем пока не мрет приложение
while (not terminated) do
begin
Fready:=false;
//'создаем сокет, слушаем, реагируем'
SockH:=fpSocket(AF_INET, SOCK_STREAM,0);
SockAddr.sin_family:=AF_INET;
SockAddr.sin_port:=htons(22409);
SockAddr.sin_addr.s_addr:=HostToNet((127 shl 24) or 1); //127.0.0.1
sizeofSockAdr:=sizeof(SockAddr);
while (fpBind(SockH,@SockAddr, sizeofSockAdr)=-1) do
begin
writeln('Ошибка связывания');
sleep(2000);
end;
writeln('Сервер запущен....');
if (fpListen(SockH,1)=-1) then
writeln('Ошибка ожидания ')
else
begin
writeln('Ожидание соединения....');
SockH:=fpaccept(SockH,@SockAddr, @sizeofSockAdr);
if SockH=-1 then
writeln('error in Accept')
else
begin
//*******************************************************
writeln('есть соединение...ok');
Fready:=true;
setlength(in_buf,512);
//получаем вход поток, пока сокет на месте (запроc не привышает 36Байт))
while (SockH<>-1) do
begin
fprecv(SockH,@in_buf[0],512,0);
if length(PChar(in_buf))=0 then break;
writeln('<<'+PChar(in_buf));
//шлем на обработку!
proc_in_query(PChar(in_buf));
in_buf[0]:=0;
end;
Fready:=false;
writeln('потеряно соединение');
writeln('Закрываю сокет! =',CloseSocket(SockH));
SockH:=-1;
sleep(2000);
end;
end;
end; //end while
end;
Linus писал(а): почему периодически не биндится сокет.
CloseSocket(SockH)
fpsetsockopt(SockH, SOL_SOCKET, SO_REUSEADDR, @opt, sizeof(opt) ); \0
serbod писал(а):Для TCP-сервера алгоритм такой (для линукса, в винде в принципе то же самое):
4. принимаем входящее подключение, функция accept(), при этом создается новый сокет, похожий на исходящий, только уже подключенный
.. пункт 4 повторяем для каждого входящего подключения
procedure ServerSockThread.Execute;
var
SockAddr:TInetSockAddr;
sizeofSockAdr:longint;
opt:integer;
in_buf:TSockBuf;
begin
//существуем пока не мрет приложение
Fready:=false;
//'создаем сокет, слушаем, реагируем'
SockH:=fpSocket(AF_INET, SOCK_STREAM,0);
opt:=1;
fpsetsockopt(SockH, SOL_SOCKET, SO_REUSEADDR, @opt, sizeof(opt) );
SockAddr.sin_family:=AF_INET;
SockAddr.sin_port:=htons(22409);
SockAddr.sin_addr.s_addr:=HostToNet((127 shl 24) or 1); //127.0.0.1
sizeofSockAdr:=sizeof(SockAddr);
while (fpBind(SockH,@SockAddr, sizeofSockAdr)=-1) do
begin
writeln('Ошибка связывания');
sleep(2000);
end;
writeln('Сервер запущен....');
if (fpListen(SockH,1)=-1) then
writeln('Ошибка ожидания ')
else
begin
writeln('Ожидание соединения....');
while (not terminated) do
begin
Client:=fpaccept(SockH,@SockAddr, @sizeofSockAdr);
if Client=-1 then
writeln('error in Accept')
else
begin
//*******************************************************
writeln('есть соединение...ok');
Fready:=true;
setlength(in_buf,36);
//получаем вход поток, пока сокет на месте (запроc не привышает 36Байт))
while (Client<>-1) do
begin
fprecv(Client,@in_buf[0],35,0);
if length(PChar(in_buf))=0 then break;
writeln('<<'+PChar(in_buf));
//шлем на обработку!
proc_in_query(PChar(in_buf));
fillchar(in_buf[0],36,0);
end;
Fready:=false;
writeln('потеряно соединение');
writeln('Закрываю сокет! =',CloseSocket(Client));
end;
end; //end while
end;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13