[fpc-pascal] Sockets
Carsten Bager
carsten at beas.dk
Wed Sep 30 15:57:54 CEST 2009
If I create a TCP socket with
fpSocket(AF_INET,SOCK_STREAM,PF_UNSPEC);
fpBind(lSock, @sAddr, sizeof(sAddr))<0 then
fpListen(lSock, cMaxConn)<0 thenand
And waits for connections with
fpAccept(lSock, @nSockAddr, @nLen);
and when a connection comes in I wait for a new one (in a new thread) with
fpAccept(lSock, @nSockAddr, @nLen);
If I have 2 or more connections and one of the older one breaks I canĀ“t detect it. Sending
and the receiving seem OK.
If I break the newest one, I can detect this, and I can detect the other broken lines.
So my problem is I can only detect broken lines if it is the newest.
Is there a way around this?
Carsten
------------------------
Constructor TServer.create(pListenPort:word);
var
sAddr:TInetSockAddr;
begin
inherited Create;
debug:=false;
CloseWaitForeConnection:=false;
ConnectNr:=0;
ListenPort:=pListenPort;
lSock := fpSocket(AF_INET,SOCK_STREAM,PF_UNSPEC);
if lSock = -1 then
SockError('fpSocket:');
sAddr.Family:=af_inet;
sAddr.Port:=htons(ListenPort);
sAddr.Addr:=0;
if fpBind(lSock, @sAddr, sizeof(sAddr))<0 then
SockError('Bind: ');
if fpListen(lSock, cMaxConn)<0 then
SockError('Listen: ');
SocketError;
if debug then
Writeln('TServer.create:'+inttostr(lSock)+' SocketError:'+IntToStr(SocketError));
End;
Procedure TServer.WaitForeConnection;
Begin
repeat
if Debug then
begin
if ConnectNr=0 then
Writeln('Waiting for connections...')
else Writeln('Waiting for next connection ....');
end;
nLen := sizeof(nSockAddr);
nSockAddr.Family:=af_inet;
nSockAddr.Port:=htons(ListenPort);
nSockAddr.Addr:=0;
nSock := fpAccept(lSock, @nSockAddr, @nLen);
if nSock = -1 then SockError('Accept: ');
if Debug then
Writeln('Accepted connection from ',AddrToStr(nSockAddr.Addr),'
Port:',intToStr(nSockAddr.Port));
if ConnectNr<cMaxConn then
begin
inc(ConnectNr);
if Debug then
Writeln('Connection no ',AddrToStr(nSockAddr.Addr),' Port:',intToStr(nSockAddr.Port));
ConnectData.SockAddr:=nSockAddr;
ConnectData.Len:=nLen;
ConnectData.Sock:=nSock;
ConnectData.ConnectNr:=ConnectNr;
ConnectDataPointer:=FindTomConnectDataPos(ConnectData);
if ConnectDataPointer<>0 then
BeginThread(@StartRemoteProgram,self,ConnectDataArray[ConnectDataPointer].Thread_
Execute)
else Writeln('No space in array');
end else
begin
fpSend(nSock, at NoMoreConnections,length(NoMoreConnections),MSG_DONTWAIT);
sleep(5000);
FpShutdown(nSock, 2);
if debug then
Writeln(NoMoreConnections);
end;
until CloseWaitForeConnection;
End;
More information about the fpc-pascal
mailing list